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