天天看點

實習小結——UIBarButtonItem和UINavigationBar的坑

這一周做了很多UI方面的東西,遇到的坑主要集中在UIBarButtonItem和UINavigationBar,記錄一下備查。

UIBarButtonItem自定義位置

直接用系統預設的方式生成按鈕是無法選擇位置的,甚至連這個按鈕的預設位置都不清楚。如果想要自定義按鈕的位置,有兩種選擇。

一、直接修改系統生成的按鈕。

可以通過UIBarButtonItem的imageInsets屬性,修改圖檔的位置,進而間接的修改按鈕位置。代碼如下:

UIBarButtonItem *rightItem = [[UIBarButtonItem alloc] initWithImage:image imageWithRenderingMode:mode style:UIBarButtonItemStylePlain target:self action:xxx];
rightItem.imageInsets = UIEdgeInsetsMake(-, , , );
self.navigationItem.rightBarButtonItem = rightItem;
           

為了突出重點,第一行生成rightItem的代碼做了一些簡化處理,不用過于關注。UIEdgeInsetsMake方法分别在上、左、下、右四個方向規定了圖檔的伸縮量。

二、完全自定義按鈕。

通過UIBarButtonItem的customView屬性,可以實作按鈕的完全自定義。就不具體寫代碼了。

兩種方法的比較:

代碼簡潔性:顯然第一種方式更簡單清晰,如果隻是要簡單的移動位置,推薦第一種方式。

UI美觀性:由于第一種方法用到了系統預設的UIBarButtonItem,它在高亮狀态下是呈現透明的。而第二種方法需要自定義UIButton,預設高亮狀态下變灰。個人認為第一種方式更美一些。當然通過自定義UIButton,也可以達到同樣的效果,不過代碼會更加複雜。

動畫效果:我在項目中遇到了一個需求,當首頁面的tableview向下滑動的時候,navigationBar上的按鈕逐漸淡出消失(alpha從1到0)。這種情況下,由于UIBarButtonItem并不繼承自UIView,是以是不可能實作的。是以必須選擇第二種方法。

是以,除非必須高度自定義,否則盡量選擇代碼代碼簡單的第一種實作方式即可。

修改Cell選中時的背景顔色

系統的tableview的cell,在選中裝下變灰。美工覺得灰色太深了,需要自定義選中是的顔色。在不使用自定義UITableViewCell的情況下,可以利用cell的cell.selectedBackgroundView屬性實作效果。代碼如下:

UIColor *cellBackgroundColor = kColorFromRGBA(, , , );
cell.selectedBackgroundView = [[UIView alloc] initWithFrame:cell.frame];
cell.selectedBackgroundView.backgroundColor = cellBackgroundColor;
           

NavigationBar修改顔色

ios7及以後,是通過navigationBar的barTintColor來修改顔色的。tintColor屬性好像不能修改了。

不過在處理MFMailComposeViewController的時候,還是遇到了bug。這個ViewController是系統自帶的,用于發送回報郵件的ViewController。但是好像對它修改navigationBar顔色的代碼一直無效。查閱了很多資料後發現一種可行的解決方案。

一定要確定修改navigationBar顔色的代碼在建立MFMailComposeViewController對象之前調用。是以可以修改全局的navigationBar顔色。最後再在自己這個類的viewWillAppear方法中,把顔色改回來即可。

//這是需要建立MFMailComposeViewController的ViewController的.m檔案
//關鍵在于建立mailPicker之前先改全局的navigationBar的顔色,記得在viewWillAppear方法中改回來。

[[UINavigationBar appearance] setBarTintColor:[UIColor whiteColor]];
MFMailComposeViewController *mailPicker = [[MFMailComposeViewController alloc] init];
mailPicker.mailComposeDelegate = self;

- (void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
    [[UINavigationBar appearance] setBarTintColor:oldColor];
}
           

繼續閱讀