图片裁剪设置
圆角
:
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