1、在自定義tabBar中,往tabBar中添加按鈕的時候,預設情況下會在按鈕的前面和後面添加UITabBarBackgroundView和UIImageView,導緻子控件會增加兩個,在自動布局中就會出現排版錯誤。
解決辦法:讓自定義的tabBar繼承UIView。
2、對于tabBarItem,要想改變對象的某個屬性,最好使用KVO來監聽屬性改變,使用的方法如下:
1
2
3
4
5
6
7
8
9
<code>/**</code>
<code> </code><code>* 監聽到某個對象的屬行改變了就去調用</code>
<code> </code><code>*</code>
<code> </code><code>* @param keyPath 屬性名</code>
<code> </code><code>* @param object 那個對象的屬性被改變</code>
<code> </code><code>* @param change 屬性發生的改變</code>
<code> </code>
<code> </code><code>*/</code>
<code>- (</code><code>void</code><code>)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)</code><code>object</code>
<code>change:(NSDictionary *)change context:(</code><code>void</code>
<code>*)context</code>
使用過程分為三步:
①先監聽屬性改變:
<code>// KVO 監聽屬性改變</code>
<code>[item addObserver:self forKeyPath:</code><code>@"badgeValue"</code>
<code>options:0 context:nil];</code>
<code>[item addObserver:self forKeyPath:</code><code>@"title"</code>
<code>[item addObserver:self forKeyPath:</code><code>@"image"</code>
<code>[item addObserver:self forKeyPath:</code><code>@"selectedImage"</code>
②調用監聽方法
<code>[self observeValueForKeyPath:nil ofObject:nil change:nil</code>
<code> </code><code>context:nil];</code>
③在方法中具體實作屬性改變
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<code>-(</code><code>void</code><code>)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)</code><code>object</code>
<code>{</code>
<code> </code><code>// 文字</code>
<code> </code><code>[self setTitle:self.item.title forState:UIControlStateNormal</code>
<code> </code><code>];</code>
<code> </code><code>// 圖檔</code>
<code> </code><code>[self setImage:self.item.image forState:UIControlStateNormal];</code>
<code> </code><code>[self setImage:self.item.selectedImage forState:UIControlStateSelected];</code>
<code> </code>
<code> </code><code>// 設定提醒數字</code>
<code> </code><code>if</code>
<code>(self.item.badgeValue) {</code>
<code> </code><code>self.badgeButton.hidden = NO;</code>
<code> </code><code>// 設定文字</code>
<code> </code><code>[self.badgeButton setTitle:self.item.badgeValue forState:UIControlStateNormal];</code>
<code> </code><code>// 設定尺寸</code>
<code> </code>
<code> </code><code>CGFloat badgeButtonY = 5;</code>
<code> </code><code>CGFloat badgeButtonH =self. badgeButton.currentBackgroundImage.size.height;</code>
<code> </code><code>CGFloat badgeButtonW = self.badgeButton.currentBackgroundImage.size.width;</code>
<code> </code><code>if</code>
<code>(self.item.badgeValue.length >1) {</code>
<code> </code><code>CGSize badgeSize = [self.item.badgeValue sizeWithFont:self.badgeButton.titleLabel.font];</code>
<code> </code><code>badgeButtonW = badgeSize.width + 10;</code>
<code> </code><code>}</code>
<code> </code><code>CGFloat badgeButtonX = self.frame.size.width - badgeButtonW -10;</code>
<code> </code><code>self. badgeButton.frame = CGRectMake(badgeButtonX, badgeButtonY, badgeButtonW, badgeButtonH);</code>
<code> </code><code>}</code>
<code> </code><code>else</code>
<code> </code><code>{</code>
<code> </code><code>self.badgeButton.hidden = YES;</code>
<code>}</code>
注意,使用KVC需要釋放記憶體,調用dealloc方法:
<code>-(</code><code>void</code><code>)dealloc</code>
<code> </code><code>[self.item removeObserver:self forKeyPath:</code><code>@"badgeValue"</code><code>];</code>
<code> </code><code>[self.item removeObserver:self forKeyPath:</code><code>@"title"</code><code>];</code>
<code> </code><code>[self.item removeObserver:self forKeyPath:</code><code>@"image"</code><code>];</code>
<code>[self.item removeObserver:self forKeyPath:</code><code>@"selectedImage"</code><code>];</code>
如果不将item從self 中移除監聽,當self被銷毀時,還會調用監聽方法,導緻程式奔潰!