欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-07-03 14:50:03
...

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