我經(jīng)常使用的方法:
imageview.layer.masksToBounds = Yes;
imageview.layer.cornerRadius = 5.0f;
但是這種方法會強(qiáng)制Core Animation提前渲染屏幕的離屏繪制钝吮,而離屏繪制就會給性能帶來負(fù)面影響埋涧,會有卡頓的現(xiàn)象出現(xiàn)板辽。
正確的解決方案:使用繪圖技術(shù)
- (UIImage *)circleImage {
// NO 代表透明
UIGraphicsBeginImageContextWithOptions(self.imageview.size, NO, 0.0);
// 獲得上下文
CGContextRef cox = UIGraphicsGetCurrentContext();
// 添加一個(gè)圓
CGRect rect = CGRectMake(0, 0, self.imageview.size.width, self.imageview.size.height);
CGContextAddEllipseInRect(ctx, rect);
// 裁剪
CGContextClip(ctx);
// 將圖片畫上去
[self drawInRect:rect];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
// 關(guān)閉上下文
UIGraphicsEndImageContext();
return image;
}
還有一種解決方案:使用了貝塞爾曲線“切割”這個(gè)圖片,給UIImageView添加了的圓角棘催,其實(shí)也是通過繪圖技術(shù)來實(shí)現(xiàn)的劲弦。
UIImageView *imageview = [[UIImageView alloc] initWithFrame:CGRectMake(0,0, 100, 100)];
imageview.center = CGPointMake(200, 300);
UIImage *anotherImage = [UIImage imageNamed:@"image"];
UIGraphicsBeginImageContextWithOptions(image view.bounds.size, no, 1.0);
[[UIBezierPath bezierPathWithRoundedRect:imageview.bounds cornerRadius:50] addClip];
[anotherImage drawInRect:imageview.bounds];
imageview.image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
[self.view addSubview:imageView];