iOS開發中遇到的那些坑,持續更新
按鈕佈局,上下排版
在使用中,用一個圖文上下排版形式的按鈕,機會還是蠻多的。這種情況,大多數都是直接修改 按鈕的 imageEdgeInsets
和 titleEdgeInsets
。eg:
Btn.titleEdgeInsets = UIEdgeInsetsMake(Btn.imageView.frame.size.height ,-Btn.imageView.frame.size.width, 0.0,0.0);
Btn.imageEdgeInsets = UIEdgeInsetsMake(0.0, 0.0,0.0, -Btn.titleLabel.bounds.size.width);
類似這種的一種形式,可以讓按鈕的佈局變成一個 上下圖文 的佈局形式。當然,使用 imageEdgeInsets
和 titleEdgeInsets
也可以修改 按鈕上 圖文的 間距,不至於那麼緊湊,表現上更加好看。
UITableView
-
刪除多餘的分割線
在開發中,有時候會遇到 資料來源 的數量並不能鋪滿整個螢幕,在tableView
下方留下一大段的分割線空白cell。那麼這時候,只需要 設定tableView
的footerView
。eg:xxTableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero]
或者是在 實現
UITableViewDelegate
中的一個代理方法。-(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
返回值,設定為一個很小的數值,如果設定為0的話,那麼是不失效的。因此在使用上,我更偏向於直接第一種方法。
-
分割線頂頭
總覺得UITableView
預設的分割線會自動留空一定的間距,估計對於處女座會是一萬點的傷害。上網查過資料,說iOS6之前的話,是預設頂格的。(摔。iOS6的年代我還苦逼刷著一代神機defy。(逃。後來在某些資料上看到,只需要重新設定其layoutMargins
或者separatorInset
。由於layoutMargins
是 iOS8 以後才有的,因此在 實現過程中,需要對 系統版本進行一個判斷,iOS8 之後的版本使用前者,iOS7 的話,則使用後者。eg:[cell setLayoutMargins:UIEdgeInsetsZero]; // iOS8+ [cell setSeparatorInset:UIEdgeInsetsZero]; // iOS7
我是在
UITableViewDataSource
的一個代理方法中進行實現的。-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
UITabBar
修改UITabBar
的背景顏色時,並不能通過修改 backgroundColor
屬性來修改,這樣修改的結果並不會起到任何效果。有兩種方法可以進行修改:
-
通過修改
tintColor
屬性,但是UITabBar
預設有一個透明作用的屬性——translucent
。該值預設為YES
。如果沒有將其設定為NO
的話,那麼顯示出來的tabBar
會有一種蒙板之類的效果。還是直接上程式碼吧self.tabBar.barTintColor = [UIColor redColor]; self.tabBar.translucent = NO;
-
將一個
view
插進tabBar
的第一位,即——UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, _tabBar.bounds.size.height)]; view.backgroundColor = [UIColor redColor]; [_tabBar insertSubview:view atIndex:0];
修改選中的tabBarItem
的背景,那麼就要修改其selectionIndicatorImage
。但是,之前使用的時候,發現點選之後,圖片並不能拉伸。在每個item
的左右兩邊都會留下一小段未覆蓋的部分。
_tabBar.selectionIndicatorImage = [UIImage imageNamed:@"xx"];
設定selectedItem
的selectedImage
時,需要修改圖片的renderingMode
,不然顯示出來還是 預設的藍色。即——
UIImage *selectedImage = [UIImage imageNamed:@"xx"];
selectedImage = [selectedImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
_tabBar.selectionIndicatorImage = selectedImage;
設定selectedItem
選中時的字型顏色,可以通過修改initialize
方法裡面進行更改,即——
+(void)initialize {
UITabBarItem *item = [UITabBarItem appearanceWhenContainedIn:self, nil];
NSMutableDictionary *colorDic = [NSMutableDictionary dictionary];
colorDic[NSForegroundColorAttributeName] = [UIColor redColor];
[item setTitleTextAttributes:colorDic forState:UIControlStateSelected];
}
也可以直接修改 UITabBarItem
的appearance
,即——
[[UITabBarItem appearance] setTitleTextAttributes:[NSDictionary dictionaryWithObject:[UIColor whiteColor] forKey:NSForegroundColorAttributeName ] forState:UIControlStateSelected];
諸如這樣的形式。也可以用其修改字型等。
iOS7+
自帶右劃返回手勢
iOS7
之後,加入了一個 右劃返回 的手勢事件。但是這個的前提是,使用iOS
原生的NavigationBar
。如果是自定義NavigationBar
之類的話,那麼這個 右劃返回上一頁 的功能就會失效。這時候,只要使用以下兩句程式碼,便可以繼續使用這功能了。
self.navigationController.interactivePopGestureRecognizer.enabled = YES;
self.navigationController.interactivePopGestureRecognizer.delegate = self;
獲取所屬UIViewController
有時候,在一個 UIView
的類下,要進行一些操作,比如自定義的某個方法,需要傳入一個UIViewController
的值,那麼這時候該如何進行傳值。可以用以下程式碼找到所屬的UIViewController
。
-(UIViewController*)viewController {
for (UIView* next = [self superview]; next; next = next.superview) {
UIResponder* nextResponder = [next nextResponder];
if ([nextResponder isKindOfClass:[UIViewController class]]) {
return (UIViewController*)nextResponder;
}
}
return nil;
}
UIScrollView
有時候,在使用UIScrollView
的過程中,會發現裡面所有的控制元件都下移了20。那麼這時,在對應的controller
中,加上
self.automaticallyAdjustsScrollViewInsets = NO