通过CALayer和图片裁剪设置圆角

图片裁剪设置圆角

1、通过设置和图片同样大小的上下文
2、设置圆形裁剪区域(创建圆形路径、把路径设置为裁剪区域addClip)
3、绘制图片
4、从上下文中获取图片
5、关闭上下文(上下文是手动开启的,不是系统自动开启的)

   // 0.加载图片
    UIImage *image = [UIImage imageNamed:@"头像"];
    // 1.开启位图上下文,跟图片尺寸一样大
    UIGraphicsBeginImageContextWithOptions(image.size, NO, 0);
    // 2.设置圆形裁剪区域,正切与图片
    // 2.1创建圆形的路径
    UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(0, 0, image.size.width, image.size.height)];
    // 2.2把路径设置为裁剪区域
    [path addClip];
    // 3.绘制图片
    [image drawAtPoint:CGPointZero];
    // 4.从上下文中获取图片
    UIImage *clipImage = UIGraphicsGetImageFromCurrentImageContext();
    // 5.关闭上下文
    UIGraphicsEndImageContext();
    _imageView.image = clipImage;


通过裁剪方式设置圆角圆角边框

1、开启一个比图片大的上下文。
2、设置圆形裁剪区域
3、绘图

为系统添加一个分类:
UIImage+Image.h
#import 
@interface UIImage (Image)
+ (UIImage *)imageWithClipImage:(UIImage *)image borderWidth:(CGFloat)borderWidth borderColor:(UIColor *)color;
@end
UIImage+Image.m
#import "UIImage+Image.h"
@implementation UIImage (Image)
+ (UIImage *)imageWithClipImage:(UIImage *)image borderWidth:(CGFloat)borderWidth borderColor:(UIColor *)color
{
    // 图片的宽度和高度
    CGFloat imageWH = image.size.width;
    // 设置圆环的宽度
    CGFloat border = borderWidth;
    // 圆形的宽度和高度
    CGFloat ovalWH = imageWH + 2 * border;
    // 1.开启上下文
    UIGraphicsBeginImageContextWithOptions(CGSizeMake(ovalWH, ovalWH), NO, 0);
    // 2.画大圆
    UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(0, 0, ovalWH, ovalWH)];
    [color set];
    [path fill];
    // 3.设置裁剪区域
    UIBezierPath *clipPath = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(border, border, imageWH, imageWH)];
    [clipPath addClip];
    // 4.绘制图片
    [image drawAtPoint:CGPointMake(border, border)];
    // 5.获取图片
    UIImage *clipImage = UIGraphicsGetImageFromCurrentImageContext();
    // 6.关闭上下文
    UIGraphicsEndImageContext();
    return clipImage;   
}
@end

通过CALayer设置圆角的三种方式
通过CALayer给view设置圆角半径

view.layer.cornerRadius = 20;圆角半径
view.layer.borderWidth = 2;边框
view.layer.borderColor =[UIColor redColor];边框颜色

方式一:直接设置layer
self.view.layer.cornerRadius = 100;
self.view.layer.backgroundColor =[UIColor colorWithPatternImage:[UIImage imageNamed:@"yx"]].CGColor;//根据图片设置颜色
方式二:自己创建layer,添加layer,超出裁剪
    CALayer *layer = [CALayer layer];
    layer.frame = CGRectMake(10,10,300,500);
    layer.contents = (id)[UIImage imageNamed:@"yx"].CGImage;
    [self.view.layer addSublayer:layer];
    self.view.layer.cornerRadius = 100;
    self.view.layer.masksToBounds = YES;
通过CALayer给imageView设置圆角半径
方式三:imageView设置超出主层的裁剪
CALayer分为主层和内容层。图片会加到显示内容的层上
imageView.layer.contents;内容层。
imageView.layer.cornerRadius = 20;设置主层的边框。
imageView.layer.masksToBounds = YES;超过主层的内容裁剪掉。
imageView.layer.borderWidth = 2;边框
imageView.layer.borderColor =[UIColor redColor];边框颜色
注意:

在layer上设置圆角cornerRadius是直接作用在主层上的,
设置view上的圆角显示出来的就是想要的效果。
而在imageView上的layer设置圆角也是直接设置在主层上的,而图片是加载在layer的内容层上的(contents),所以需要设置超过主层的内容裁剪掉

注意:

CALayer的这种方法改变的是控件,会有锯齿。
并且如果需要显示的图层的控件是长方形,那么使用图片裁剪的方式,
因为CALayer是相当于作用在控件上的,会变成长方形,而图片裁剪是直接作用在图片上的。


layer能进行图层形变

view.layer.transform = CATransform3DMakeRotation(角度,x,y,z);旋转
view.layer.transform = CATransform3DMakeScale(x,y,z);缩放
通过KVC方式
[view.layer setValue:@0.5 forKeyPath:@"transform.scale"];缩放
[view.layer setValue:@(M_PI) forKeyPath:@"transform.rotation"];旋转(尽量不要使用KVC方式设置旋转)

给图层设置内容

CALayer *layer = [CALayer layer];
layer.frame = CGRectMake(10,10,50,50);
layer.contents = (id)[UIImage imageNamed:@"图片"].CGImage;
[self.view.layer addSublayer:layer];


QuartzCore框架、CoreGraphics框架
首先
CALayer是定义在QuartzCore框架中的
CGImageRef、CGColorRef两种数据类型是定义在CoreGraphics框架中的
UIColor、UIImage是定义在UIKit框架中的
其次
QuartzCore框架和CoreGraphics框架是可以跨平台使用的,在iOS和Mac OS X上都能使用
但是UIKit只能在iOS中使用
为了保证可移植性,QuartzCore不能使用UIImage、UIColor,只能使用CGImageRef、CGColorRef
通过CALayer和图片裁剪设置圆角_第1张图片
QuartzCore.png

通过CALayer和图片裁剪设置圆角_第2张图片
CoreGraphics.png

你可能感兴趣的:(通过CALayer和图片裁剪设置圆角)