注:由于iOS13 系統(tǒng)對(duì)一些私有屬性的限制锉试,以下的方式不能保證正確性。在iOS13 系統(tǒng)下,UISearchBar 中的視圖層級(jí)已經(jīng)更換斤吐,UITextField 已經(jīng)可以外部可用搔涝;UITextField 的 _placeholderLabel 成員變量的類型已經(jīng)不是 UILabel,以往的設(shè)置方法已經(jīng)不能使用和措。類似的更換非常多庄呈,大家還是謹(jǐn)慎使用私有方式進(jìn)行設(shè)置,因此私有 api 具有上架風(fēng)險(xiǎn)派阱,另外就是系統(tǒng)并不會(huì)向下兼容地更新诬留。
由于系統(tǒng)并未提供相應(yīng)的屬性和方法讓我們修改樣式,我們最多只能修改顏色
// 修改顏色
@property(nullable, nonatomic,strong) UIColor *pageIndicatorTintColor;
@property(nullable, nonatomic,strong) UIColor *currentPageIndicatorTintColor;
當(dāng)我們需要更換樣式時(shí)贫母,則顯得很困難文兑,我們只可能通過(guò)KVC間接修改對(duì)應(yīng)的值,前提是系統(tǒng)有相應(yīng)的成員變量腺劣,另外系統(tǒng)可能更換成員變量绿贞,這種方式不是很妥當(dāng)
解決方案
1、尋找成員變量
使用運(yùn)行時(shí)獲取到UIPageControl的成員變量
unsigned int count;
Ivar* ivars = class_copyIvarList([UIPageControl class], &count);
for (int i=0; i<count; i++) {
Ivar ivar = ivars[i];
NSString* name = [NSString stringWithUTF8String:ivar_getName(ivar)]; // 名稱
NSString* type = [NSString stringWithUTF8String:ivar_getTypeEncoding(ivar)]; // 類型
NSLog(@"成員變量:%@ -> 類型:%@",name,type);
}
結(jié)果:
我們注意到有兩個(gè)比變量 _currentPageImage 和 _pageImage 橘原,這兩個(gè)就是我們需要更改的樣式籍铁,分別對(duì)應(yīng)選中和未選中的樣式
2、KVC方式修改
KVC可以修改對(duì)象的屬性趾断、成員變量拒名,包括私有成員變量
[self.pageControl setValue:[UIImage imageNamed:@"selected"] forKeyPath:@"_currentPageImage"];
[self.pageControl setValue:[UIImage imageNamed:@"normal"] forKeyPath:@"_pageImage"];
3、結(jié)果
常見的還是有修改UITextField的_placeholderLabel樣式歼冰,同樣方法靡狞,想了解運(yùn)行時(shí)知識(shí)的小伙伴的點(diǎn)擊這里,運(yùn)行時(shí)的相關(guān)應(yīng)用可以看這里隔嫡,還有這里
除了上述的 間接的甸怕、曲折的修改樣式的方法,如果想實(shí)現(xiàn)更為優(yōu)雅或者更為酷炫的樣式的話腮恩,完全可以自定義控件梢杭,掌控性更好,只是稍微麻煩一點(diǎn)而已
補(bǔ)充:
筆者覺得替換為圖片時(shí)秸滴,兩個(gè)控件的間距太大武契,試圖調(diào)整之間的間距,發(fā)現(xiàn)系統(tǒng)無(wú)法更改其位置和大小荡含,替換的讀者需要注意一下咒唆,或者有改變位置的方法,希望留言