为了修改带分组tableview的section header跟随置顶的问题,网上的奇淫技巧比方通过修改scroller的回调方法,体验不好,正规的方法是修改为tableView的UITableViewStyleGrouped模式,但该模式下列表section Header的高度过高,需要设置一个footer的高度:
代码语言:javascript复制- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
return 0.01;
}
结束当前界面,进入新的界面,使用导航的pushViewController进入下一个页面,需要删除navigationController.viewControllers中保存的当前页面
代码语言:javascript复制[self.navigationController pushViewController:vc animated:YES];
//结束当前界面
__weak typeof(self) weakSelf = self;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSMutableArray *viewControllers = [NSMutableArray arrayWithArray:weakSelf.navigationController.viewControllers];
[viewControllers removeObjectAtIndex:viewControllers.count - 2];
weakSelf.navigationController.viewControllers = viewControllers;
});
短延时处理的奇淫技巧:
代码语言:javascript复制dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.01 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
});
异常处理:
代码语言:javascript复制//抛出异常
[NSException raise:@"WebService error" format:@"%@", returnJson4SOAP];
//捕获异常
@try
{
}@catch (NSException * e) {
NSLog(@"Exception: %@", e);
return;
}
约束一个元素的位置,最原始的就是frame,如果是使用约束,也需要至少指定左、上,宽、高,否则约束会出现异常(xib中配置约束或者使用Masonry配置约束),比方设置一个view在屏幕的底部的约束:
代码语言:javascript复制[view mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.view);
make.bottom.equalTo(self.view);
make.width.equalTo(@SCREEN_WIDTH);
make.height.equalTo(@102);
}];
圆角处理:不能仅仅把图片处理成圆角!
代码语言:javascript复制imageView.layer.cornerRadius = imageView.frame.size.width/2;
imageView.layer.masksToBounds = YES;
界面进入后隐藏输入框默认焦点的键盘
推荐做法:
代码语言:javascript复制- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
if (!self.textView.isFirstResponder) {
[self.textView resignFirstResponder];
}
}
不推荐的做法,会导致所有的UITextView出不来键盘:
代码语言:javascript复制@implementation UITextView (DisableCopyPaste)
- (BOOL)canBecomeFirstResponder
{
return NO;
}
@end
诸如导航栏标题上的背景颜色修改,搜索框的背景修改,网上都有很多奇淫技巧,发现都不正规,正规的改法往往很简单,原因在于控件有很多层次,由于没有找到背景所在的正确的层级,所以你发现很多的设置不生效,关键的点是经常使用Debug View Hierarchy观察你想要修改的控件对象,这时候修改才会一步到位,比方搜索框的背景修改:
代码语言:javascript复制不生效:
self.searchBar.backgroundColor = UIColorMake(170, 148, 105);
生效的方法:
[self.searchBar setBackgroundImage:[UIImage qmui_imageWithColor:UIColorDarkGold] forBarPosition:UIBarPositionAny barMetrics:UIBarMetricsDefault];
[self.searchBar setSearchFieldBackgroundImage:[UIImage qmui_imageWithColor:UIColorDarkGold] forState:UIControlStateNormal];
//qmui扩展UIImage的方法
(UIImage *)qmui_imageWithColor:(UIColor *)color {
return [UIImage qmui_imageWithColor:color size:CGSizeMake(4, 4) cornerRadius:0];
}
(UIImage *)qmui_imageWithColor:(UIColor *)color size:(CGSize)size cornerRadius:(CGFloat)cornerRadius {
size = CGSizeFlatted(size);
CGContextInspectSize(size);
color = color ? color : UIColorClear;
BOOL opaque = (cornerRadius == 0.0 && [color qmui_alpha] == 1.0);
return [UIImage qmui_imageWithSize:size opaque:opaque scale:0 actions:^(CGContextRef contextRef) {
CGContextSetFillColorWithColor(contextRef, color.CGColor);
if (cornerRadius > 0) {
UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:CGRectMakeWithSize(size) cornerRadius:cornerRadius];
[path addClip];
[path fill];
} else {
CGContextFillRect(contextRef, CGRectMakeWithSize(size));
}
}];
}
带一个分组section header的tableview,滑动到section header后不再滑动:
代码语言:javascript复制//禁止滑动出界
self.tableView.bounces = NO;
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
if (self.memberType == MEMBER_TYPE_INNER_GROUP){
return;
}
//NSArray *array = [self.tableView visibleCells];
//NSIndexPath * indexPath = [self.tableView indexPathForCell:array.firstObject];
//NSLog(@"滑到了第 %ld 组 %ld个",indexPath.section, indexPath.row);
long topHeaderY = self.tableView.tableHeaderView.frame.size.height;
long scrollY = scrollView.contentOffset.y;
if (scrollY >= topHeaderY){
//禁止scroll
//self.tableView.scrollEnabled = NO;
scrollView.contentOffset = CGPointMake(0, topHeaderY);
}
return;
}
ViewController的预加载
代码语言:javascript复制 [viewController load];
//[viewController loadViewIfNeeded];