iOS 實現圖片圓角的幾種方式
第一種方法:通過設定layer的屬性
最簡單的一種,但是很影響效能,一般在正常的開發中使用很少.
UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(100, 100, 100, 100)]; //只需要設定layer層的兩個屬性 //設定圓角 imageView.layer.cornerRadius = imageView.frame.size.width / 2; //將多餘的部分切掉 imageView.layer.masksToBounds = YES; [self.view addSubview:imageView];
第二種方法:使用貝塞爾曲線UIBezierPath和Core Graphics框架畫出一個圓角
UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(100, 100, 100, 100)]; imageView.image = [UIImage imageNamed:@"1"]; //開始對imageView進行畫圖 UIGraphicsBeginImageContextWithOptions(imageView.bounds.size, NO, 1.0); //使用貝塞爾曲線畫出一個圓形圖 [[UIBezierPath bezierPathWithRoundedRect:imageView.bounds cornerRadius:imageView.frame.size.width] addClip]; [imageView drawRect:imageView.bounds];
imageView.image = UIGraphicsGetImageFromCurrentImageContext(); //結束畫圖 UIGraphicsEndImageContext(); [self.view addSubview:imageView];
第三種方法:使用CAShapeLayer和UIBezierPath設定圓角
UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(100, 100, 100, 100)]; imageView.image = [UIImage imageNamed:@"1"]; UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:imageView.bounds byRoundingCorners:UIRectCornerAllCorners cornerRadii:imageView.bounds.size];
CAShapeLayer *maskLayer = [[CAShapeLayer alloc]init]; //設定大小 maskLayer.frame = imageView.bounds; //設定圖形樣子 maskLayer.path = maskPath.CGPath; imageView.layer.mask = maskLayer; [self.view addSubview:imageView];
以上三種方法來自簡書連結 http://www.jianshu.com/p/e97348f42276 這個連結的文章裡說第三種方法最好 對記憶體消耗最少,可是在另一篇比較權威的文章http://www.jianshu.com/p/57e2ec17585b《iOS-離屏渲染詳解》裡說第三種方法會使用到mask屬性,會離屏渲染,不僅這樣,還曾加了一個 CAShapLayer物件.著實不可以取。並指出第二種方法比較可取。另外還提出了第四種方法。 第四種方法:使用帶圓形的透明圖片.(需要UI做一個切圖)
UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(100, 100, 100, 100)]; imageView.image = [UIImage imageNamed:@"美國1.jpeg"]; UIImageView *imageView1 = [[UIImageView alloc]initWithFrame:CGRectMake(100, 100, 100, 100)]; imageView1.image = [UIImage imageNamed:@"圓形白邊中空圖"]; [self.view addSubview:imageView]; [self.view addSubview:imageView1];
最好最好的方法應該是第四種了,雖然比較笨, 但是不會引發離屏渲染,對記憶體消耗會比較小。