天天看點

自定義tabBar中的注意事項

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 &gt;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被銷毀時,還會調用監聽方法,導緻程式奔潰!