iOS开发中遇到的那些坑,持续更新

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

相关推荐