- 不好的解決方案:使用下面的方式會強制Core Animation提前渲染屏幕的離屏繪制, 而離屏繪制就會給性能帶來負面影響,會有卡頓的現象出現。
self.view.layer.cornerRadius = 5.0f;
self.view.layer.masksToBounds = YES;
- 正確的解決方案:使用繪圖技術
- (UIImage*)imageAddCornerWithRadius:(CGFloat)radius andSize:(CGSize)size{
CGRect rect = CGRectMake(0, 0, size.width, size.height);
UIGraphicsBeginImageContextWithOptions(size, NO, [UIScreen mainScreen].scale);
CGContextRef ctx = UIGraphicsGetCurrentContext();
UIBezierPath * path = [UIBezierPath bezierPathWithRoundedRect:rect byRoundingCorners:UIRectCornerAllCorners cornerRadii:CGSizeMake(radius, radius)];
CGContextAddPath(ctx,path.CGPath);
CGContextClip(ctx);
[self drawInRect:rect];
CGContextDrawPath(ctx, kCGPathFillStroke);
UIImage * newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
注意點:
1.離屏渲染并非由設置圓角導致的!
2.雖然設置 masksToBounds 會導致離屏渲染,從而影響性能,但是這個影響到底會有多大?在我的 iPhone6 上,即使出現了 17 個帶有圓角的視圖,滑動時的幀數依然在 58 - 59 fps 左右波動。
3.在百度上看到給imageView設置圓角用了下面的這個方法
let maskPath = UIBezierPath(roundedRect: rect,
byRoundingCorners: .AllCorners,
cornerRadii: CGSize(width: 3, height: 3))
let maskLayer = CAShapeLayer()
maskLayer.frame = self.bounds
maskLayer.path = maskPath.CGPath
self.layer.mask = maskLayer
這種方法本質上是用遮罩層 mask 來實現,因此同樣無可避免的會導致離屏渲染。