iOS開發中遇到的那些坑,持續更新

六叔發表於2016-01-26

iOS開發中遇到的那些坑,持續更新

按鈕佈局,上下排版

在使用中,用一個圖文上下排版形式的按鈕,機會還是蠻多的。這種情況,大多數都是直接修改 按鈕的 imageEdgeInsetstitleEdgeInsets。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);

類似這種的一種形式,可以讓按鈕的佈局變成一個 上下圖文 的佈局形式。當然,使用 imageEdgeInsetstitleEdgeInsets 也可以修改 按鈕上 圖文的 間距,不至於那麼緊湊,表現上更加好看。

UITableView

  1. 刪除多餘的分割線
    在開發中,有時候會遇到 資料來源 的數量並不能鋪滿整個螢幕,在 tableView 下方留下一大段的分割線空白cell。那麼這時候,只需要 設定 tableViewfooterView。eg:

     xxTableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero]

    或者是在 實現 UITableViewDelegate 中的一個代理方法。

    -(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section

    返回值,設定為一個很小的數值,如果設定為0的話,那麼是不失效的。因此在使用上,我更偏向於直接第一種方法。

  2. 分割線頂頭
    總覺得 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屬性來修改,這樣修改的結果並不會起到任何效果。有兩種方法可以進行修改:

  1. 通過修改 tintColor屬性,但是UITabBar預設有一個透明作用的屬性——translucent。該值預設為YES。如果沒有將其設定為NO的話,那麼顯示出來的tabBar會有一種蒙板之類的效果。還是直接上程式碼吧

    self.tabBar.barTintColor = [UIColor redColor];
    self.tabBar.translucent = NO;
  2. 將一個 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"];

設定selectedItemselectedImage時,需要修改圖片的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];
}

也可以直接修改 UITabBarItemappearance,即——

[[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

相關文章