iOS 实用小技巧说明

iOS开发中长使用的一些简单的的小技巧总结一下

iOS 实用小技巧

控件的局部圆角问题

你是不是也遇到过这样的问题,一个button后者Label,只要右边的两个圆角,或者一个圆角,改怎么做呢,需要图层蒙版帮助我们:

1
2
3
4
5
6
7
8
CGRect rect = CGRectMake(0, 0, 200, 200);
CGSize radio = CGSizeMake(5, 5);//圆角尺寸
UIRectCorner corner = UIRectCornerTopLeft|UIRectCornerTopRight;//这只圆角位置
UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:rect byRoundingCorners:corner cornerRadii:radio];
CAShapeLayer *masklayer = [[CAShapeLayer alloc]init];//创建shapelayer
masklayer.frame = button.bounds;
masklayer.path = path.CGPath;//设置路径
button.layer.mask = masklayer;
这里关于UIBezierPath说明一些知识点:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
UIBezierPath相关的API说明

+ (instancetype)bezierPath;//初始的一个绘制路径
+ (instancetype)bezierPathWithRect:(CGRect)rect;//初始化为Rect类型的
//绘制出来的是个半圆的效果
+ (instancetype)bezierPathWithOvalInRect:(CGRect)rect;
//处理的是多个角的问题,会把视图的Corner
+ (instancetype)bezierPathWithRoundedRect:(CGRect)rect cornerRadius:(CGFloat)cornerRadius;
// rounds all corners with the same horizontal and vertical radius
//设置多个角的情况
+ (instancetype)bezierPathWithRoundedRect:(CGRect)rect byRoundingCorners:(UIRectCorner)corners cornerRadii:(CGSize)cornerRadii;
//绘制圆 center就是圆心 radius圆的半径 开始的位置 结束的位置 完整的是一个圆 clockwise展示的是哪个部分
+ (instancetype)bezierPathWithArcCenter:(CGPoint)center radius:(CGFloat)radius startAngle:(CGFloat)startAngle endAngle:(CGFloat)endAngle clockwise:(BOOL)clockwise;
按照指定的path路径进行绘制
+ (instancetype)bezierPathWithCGPath:(CGPathRef)CGPath;

关于navigationBar的透明问问题,

如果仅仅把navigationBar的alpha设置为0的话,那就相当于把navigationBar给隐藏了,大家都知道,父视图的alpha设置为0的话,那么子视图全部是透明的,那么相应的navigationBar的标题和左右两个按钮都会消失,这样显然达不到我们要求的效果,
如果仅仅只是navigationBar透明,按钮和标题都可以使用一下方法

1
[self.navigationController.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];

细心的同学会发现此时navigationBar下面是有一根线的,取消这根线的办法是:
1
self.navigationController.navigationBar.shadowImage = [UIImage new];
如果你想在透明的的基础下实现下拉距离,有透明变得不透明的效果,这就需要另一中办法来实现
1
2
3
//navigationBar是一个复合视图,它有很多控件组成,那么我们就可以从他的内部入手
//这里可以根据scrollview的便宜量来设置alpha就实现了渐变的透明效果
[[self.navigationController.navigationBar subviews] objectAtIndex:0].alpha = 0;
全局设置navigationBar标题的样式和barItem的标题样式
1
2
3
[[UINavigationBar appearance] setBarTintColor:UIColorWithHexRGB(0xfefefe)];
[[UINavigationBar appearance] setTitleTextAttributes:@{NSFontAttributeName:[UIFont boldSystemFontOfSize:18],NSForegroundColorAttributeName:UIColorWithHexRGB(0xfe6d27)}];
[[UITabBarItem appearance] setTitleTextAttributes:@{NSFontAttributeName : [UIFont boldSystemFontOfSize:10],NSForegroundColorAttributeName : UIColorWithHexRGB(0x666666)} forState:UIControlStateNormal];

相信使用中中肯定遇到过,一个页面隐藏navigationBar,另一个页面不隐藏,两个页面进行push和pop的时候,尤其是侧滑手势返回返回的时候,不做处理就会造成滑动返回时,navigationBar位置是空的,直接显示一个黑色或者显示在下面一层视图,很难看。这需要我们加入过度动画来隐藏或者显示navigationBar:在返回后将要出现的页面实现ViewWillAppear方法,需要隐藏就设置为YES,需要显示设置为NO

1
2
3
4
- (void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
[self.navigationController setNavigationBarHidden:NO animated:YES];
}

侧滑手势返回

iOS的侧滑返回手势有很好的操作体验,不支持侧滑返回的应用绝对不是好应用,但是在开发过程中在自定义返回按钮,或者某些webView,tableView等页面,侧滑返回手势失效,这时候就需要我们来进行设置,可以在积累里面实现如下代码:

1
2
3
4
if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
//需要遵循一下手势的代理 self.navigationController.interactivePopGestureRecognizer.delegate = self;
self.navigationController.interactivePopGestureRecognizer.enabled = YES;
}

可以实现给UIView设置图片,简单的总结,

1
2
3
4
5
UIImage *image = [UIImage imageNamed:@"playing"];
_layerView.layer.contents = (__bridge id)image.CGImage;
_layerView.layer.contentsCenter = CGRectMake(0.25, 0.25, 0.5, 0.5);
同样可以设置显示的图片范围
不过此处略有不同,这里的四个值均为0-1之间;对应的依然是写x,y,widt,height