- mask
CALayer的头文件关于mask的说明,mask实际上layer内容的一个遮罩,如果我们把mask是透明的,实际看到的layer是完全透明的,
也就是说只有mask的内容不透明的部分和layer叠加的部分才会显示出来
实例一:利用mask 实现 图片圆角
- 定义分类 UIView + Circle
import UIKit
extension UIView{
func circleMaskView(arcCenter: CGPoint? = nil, radius: CGFloat? = nil) -> UIView {
// 创建遮罩
let center = (arcCenter != nil) ? arcCenter : self.center
let radiusNum = (radius != nil) ? radius : (self.frame.size.width>self.frame.size.height ? self.frame.size.width/2 : self.frame.size.height/2)
let path = UIBezierPath(arcCenter: center!, radius: radiusNum!, startAngle: 0, endAngle: 2 * CGFloat(M_PI), clockwise: true)
let shapeLayer = CAShapeLayer()
shapeLayer.path = path.CGPath
// 设置 遮罩
self.layer.mask = shapeLayer
return self
}
}
- 使用:
import UIKit
class DemoViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = UIColor.whiteColor()
// 用户头像
let img = UIImageView(image: UIImage(named: "personIcon"))
img.circleMaskView(nil, radius: 40)
// 添加用户头像 到视图 中
self.view.addSubview(img)
img.center = self.view.center
}
}
实例二:放大效果
-
资源图片:maskimg@2x.png
import UIKit
class ViewController: UIViewController{
//MARK: - lazy
/// 背景图片
let bg = UIImageView(image: UIImage(named: "bg_splash_storke"))
/// 遮罩
// 这里 我 使用 Image作为 遮罩层内容, 当然,你也可以 使用 CAShapeLayer 结合 CGPath 设置 复杂的 路径
lazy var bgMaskLayer: CALayer = {
let layer = CALayer()
layer.contents = UIImage(named: "maskimg")!.CGImage
layer.position = self.view.center
layer.bounds = CGRect(x: 0, y: 0, width: 100, height:100)
return layer
}()
/// 关键帧 动画 对象
lazy var anim: CAKeyframeAnimation = {
let anim = CAKeyframeAnimation(keyPath: "bounds")
anim.delegate = self
anim.duration = 1
anim.beginTime = CACurrentMediaTime() + 0.5
// 先缩小后变大
let begin_bounds = NSValue(CGRect: self.bg.layer.mask!.bounds)
let middle_bounds = NSValue(CGRect:CGRect(x: 0, y: 0, width: 50, height: 50))
let final_bounds = NSValue(CGRect:CGRect(x: 0, y: 0, width: self.view.frame.size.width*4, height: self.view.frame.size.width*4))
anim.values = [begin_bounds, middle_bounds, final_bounds]
// 每个value 发生时的时间结点 执行动画时间
anim.keyTimes = [0, 0.2,1]
// bounds 动画两次 begin_bounds -> middle_bounds -> final_bounds,所以设置了两个时间函数
anim.timingFunctions = [CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut), CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseOut)] // // EaseInEaseOut 慢进慢出 , EaseOut 快进慢出 , EaseIn 慢进快出
anim.removedOnCompletion = false // 动画结束后不移除
anim.fillMode = kCAFillModeForwards // KCAFillModeForwards: 当动画结束后,layer会一直保持着动画最后的状态。
return anim
}()
//MARK: - view 声明周期
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = UIColor.greenColor()
self.view.addSubview(bg)
bg.frame = self.view.bounds
self.bg.layer.mask = bgMaskLayer // 给 bg视图,设置遮罩层
}
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
//执行 关键帧 动画 CAKeyframeAnimation 修改bounds 实现 相应 的 动画效果
self.bg.layer.mask!.addAnimation(self.anim, forKey: "maskAnima")
}
}