-
如果切4个圆角可以直接用view.layer.cornerRaidus这个属性,需要设置layer.maskToBounds = YES;
一把没问题,如果考虑离屏渲染啥的,图片又大又多的话可能造成卡顿。 -
可以用UIBezierPath和CAShapeLayer的组合定义mask来达到切圆角的目的,并且而可以指定其中的任意圆角。如下,指定了切左上和右上2个角。
如下,
UIBezierPath *cardImgPath = [UIBezierPath bezierPathWithRoundedRect: self.cardImgView.bounds byRoundingCorners:UIRectCornerTopRight | UIRectCornerTopLeft cornerRadii:CGSizeMake(5, 5)];
CAShapeLayer *cardLayer = [[CAShapeLayer alloc] init];
cardLayer.path = cardImgPath.CGPath;
self.cardImgView.layer.mask = cardLayer;
- 今天用xib自定义了一个view,像往常一样,用上面的代码去切圆角,发现无论设置指定的圆角,它只显示左上角被切了,其余的角没变化。
通过打印xib中子控件的坐标,发现size都不正常,没和屏幕适配。而且就算把size设置小一些还是不起作用。
经过思考xib和控制器的关系,在xib显示到控制器显示的时候,其实已经存在了,xib的子控件大小还没和屏幕适配。当设置了xib的frame,通过autoLayout子控件才显示正常。这才看起来正常了。
所以,在xib加载的时候它需要自动调整才能适配屏幕,autoLayout的时候去切圆角,frame不是确定的,它就没法去切其他的角了。
所以,指定确定frame就可以了。
经过上面的一波分析,解决办法就是直接指定rect,不使用view.bounds,如下:
UIBezierPath *cardImgPath = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0, size.width, size.height) byRoundingCorners:UIRectCornerTopRight | UIRectCornerTopLeft cornerRadii:CGSizeMake(5, 5)];
PS:这个size是在设置xib的frame后计算的。根据自己的实际需求计算size。
网友评论