插件擴(kuò)展:一般插件都支持?jǐn)U展,對自己我創(chuàng)建的分類進(jìn)行支持.
找到安裝插件的工程文件,全局搜索install 安裝路徑
根據(jù)安裝路徑查找本地的文件
修改文件中的plist文件,支持本地化內(nèi)容.
解決文字被渲染.
如果顯示出來默認(rèn)藍(lán)色,首先考慮的屬性是tintColor
-tintColor always returns a color. The color returned is the first non-default value in the receiver's superview chain (starting with itself).
If no non-default value is found, a system-defined color is returned.
If this view's -tintAdjustmentMode returns Dimmed, then the color that is returned for -tintColor will automatically be dimmed.
If your view subclass uses tintColor in its rendering, override -tintColorDidChange in order to refresh the rendering if the color changes.
注釋:大致意思是說,這個屬性會一直返回一個顏色,如果沒有默認(rèn)或者設(shè)置顏色,返回系統(tǒng)的顏色也就是經(jīng)程僖遥看到的藍(lán)色.
@property(null_resettable, nonatomic, strong) UIColor *tintColor NS_AVAILABLE_IOS(7_0);
UITabBarItem里沒有關(guān)于文字顏色的屬性,去父類UIBarItem中查找到- (void)setTitleTextAttributes:(nullableNSDictionary *)attributes forState:(UIControlState)stateNS_AVAILABLE_IOS(5_0)UI_APPEARANCE_SELECTOR;這個方法可以設(shè)置文字的屬性
TextAttribute 富文本屬性
關(guān)于設(shè)置文字在哪個方法中寫:
①+ (void)initialize第一次使用類或者他的子類的時候調(diào)用,有可能會調(diào)用多次.
②+ (void)load第一次加載類的時候調(diào)用,只會調(diào)用一次 ?在此,選用這個方法
5.在本項目中,此處文字的字體狀態(tài)是,Normal狀態(tài),而不是高亮狀態(tài)
6.關(guān)于Appearance的使用
①只要遵守了UIAppearance協(xié)議就可以使用
②只有帶有UI_APPEARANCE_SELECTOR宏屬性才可以去設(shè)置
③如果使用appearance設(shè)置屬性,那么必須在顯示之前設(shè)置.
發(fā)布按鈕的設(shè)置
bug的發(fā)現(xiàn):剛開始設(shè)置后,發(fā)現(xiàn)按鈕圖片沒有正常顯示,之后調(diào)整全部tabbarButton按鈕圖片被渲染的同時,發(fā)現(xiàn)按鈕未正常顯示因為在正常狀態(tài)下圖片尺寸超過了內(nèi)容區(qū)域,同時被渲染.
解決:1.設(shè)置圖片不被渲染,正常狀態(tài)和高亮狀態(tài)下,都不被渲染.按鈕位置偏高,設(shè)置圖片內(nèi)邊距.
2.與實例程序?qū)Ρ?發(fā)現(xiàn)系統(tǒng)的按鈕沒有高亮狀態(tài),所以我們需要自定義按鈕.
自定義按鈕,我們用懶加載的方法,需要注意的是:系統(tǒng)的tabbarbutton不刪除,起到一個占位的作用,但必須設(shè)置vc2.tabBarItem.enabled=NO;button讓它自適應(yīng)tabbar分配的尺寸 ? 在viewDidLoad中設(shè)置button的位置為tabBar 中心點
Q:設(shè)置導(dǎo)航條的內(nèi)容 ? (系統(tǒng)的Item都是模型)
棧頂控制器決定導(dǎo)航條顯示的內(nèi)容,導(dǎo)航控制器不能決定(棧頂控制器是顯示在外面的view)
bug:在我們設(shè)置導(dǎo)航條按鈕后,超出按鈕范圍也能被點擊
分析:包裝成UIBarButtonItem出現(xiàn)問題
解決辦法:butto外面包裝一個UIView,再添加給UIBarButtonItem
導(dǎo)航條的內(nèi)容每個控制器都需要設(shè)置按鈕,抽取一個分類方法,方便調(diào)用.
按鈕的選中狀態(tài)必須通過代碼來實現(xiàn),其他設(shè)置無效.
bug:還沒有要顯示界面的時候,view已經(jīng)被加載.
解決:將各控制器的view背景設(shè)置交給各控制器自己去設(shè)置,這樣完成懶加載.且不會干擾后面的設(shè)置.
W:跳轉(zhuǎn)設(shè)置界面
push操作,跳轉(zhuǎn)界面后隱藏底部tabbar欄,必須要在push之前進(jìn)行設(shè)置,hidesButtonWhenPush = YES;
重新設(shè)置系統(tǒng)提供的返回按鈕: 由當(dāng)前控制器進(jìn)行管理 ?frame不是我們想要的,設(shè)置UIEdgeInsetsMaken內(nèi)邊距
因為每個界面都一樣,需要跳轉(zhuǎn)返回功能,所以返回按鈕可以統(tǒng)一配置
注意:統(tǒng)一配置會遇到的bug:
根控制器左邊按鈕,被返回按鈕覆蓋
設(shè)置時需要進(jìn)行一個判斷,判斷該控制器是否為根控制器
判斷 childViewControllers是否為空,如果為空則證明為根控制器,不需要設(shè)置返回按鈕.
注意:不能判斷當(dāng)前控制器是否為數(shù)組中childView[0],只有完成push操作時,數(shù)組才不為空,此判斷無效.
E:全局控制器都被返回按鈕覆蓋
控制器沒有遵從懶加載原則,很有可能是main中對子控制器進(jìn)行了設(shè)置,從而導(dǎo)致子控制器的view先被加載,也就是導(dǎo)航控制器的內(nèi)容先被設(shè)置,而回到main中,initwith又會調(diào)用重寫的push方法,對導(dǎo)航條內(nèi)容進(jìn)行了覆蓋.解決:將屬于各自控制器的設(shè)置放到各自自己的控制器中設(shè)置.
滑動返回功能 ? Q:上一篇中有詳細(xì)代碼解析此功能,請移步.
ios7之后,導(dǎo)航控制器自帶滑動返回功能,且是邊緣側(cè)滑返回功能.
我們修改了系統(tǒng)自帶的返回按鈕,導(dǎo)致功能失效.
分析:代理實現(xiàn)手勢的方法,可能是代理讓手勢失效了
代理在這里的作用是一個通知功能,滑動方法的實現(xiàn)在手勢中
當(dāng)我們沒有使用自定義按鈕時,系統(tǒng)默認(rèn)側(cè)滑返回的實現(xiàn),且在根控制器中不能實現(xiàn),這里的消息傳遞由代理實現(xiàn)
當(dāng)我們使用自定義按鈕的時候,系統(tǒng)的默認(rèn)代理會通知手勢,此觸摸事件不能實現(xiàn),所以清空代理讓他按照默認(rèn)方法處理,這個時候邊緣側(cè)滑功能就實現(xiàn)了.
需求:全屏側(cè)滑返回的實現(xiàn)
/*打印手勢interactivePopGestureRecognizer(交互返回)
; target= <(action=handleNavigationTransition:, target=<_UINavigationInteractiveTransition 0x7f9a4d214270>)>>
打印interactivePopGestureRecognizer.delegate代理
<_UINavigationInteractiveTransition: 0x7fda886183b0>
這兩個target時同一個類,但不是同一個對象.
*/
干掉系統(tǒng)的手勢:self.interactivePopGestureRecognizer.enabled=NO;
因為_UINavigationInteractiveTransition 是私有屬性,拿不到這個對象,但是因為手勢的代理跟target屬于同一個類型,可以用代理對象代替.
創(chuàng)建自己的滑動手勢:idtarget =self.interactivePopGestureRecognizer.delegate;
調(diào)用系統(tǒng)的滑動方法:handleNavigationTransition:
UIPanGestureRecognizer*pan = [[UIPanGestureRecognizeralloc]initWithTarget:targetaction:@selector(handleNavigationTransition:)];
實現(xiàn)自己的手勢,添加到NavigationController 的view上
[self.viewaddGestureRecognizer:pan];
設(shè)置代理,實現(xiàn)代理方法,控制手勢什么時候觸發(fā)
pan.delegate=self;