1.mask 是CALayer的一個屬性,同時也是CALayer 類型的。
2.原理:控制layer本身渲染的一個layer账月。效果是:比如imageLayer有一個maskLayer作為mask(注意maskLayer可以不跟imageLayer大小一樣),那maskLayer透明的地方歉秫,imageLayer就不會渲染,而是變透明养铸,顯示出imageLayer之后的內(nèi)容雁芙,maskLayer不透明的地方,imageLayer就會正常渲染钞螟,顯示出imageLayer本來的內(nèi)容如果maskLayer比imageLayer要小却特,那默認(rèn)的maskLayer之外的地方都是透明的,都不會渲染筛圆。
3.mask 的作用就是讓父圖層部分區(qū)域可見。
4.mask 的backgroundColor必須設(shè)置椿浓,不設(shè)置mask 背景就是透明的太援,mask 是不會起作用的,但是backgroundColor設(shè)置什么顏色無所謂扳碍。
5.為一個layer的mask 創(chuàng)建一個新的mask時提岔,這個新的mask不能有superlayer 和sublayer。(官方文檔的說明)
6.mask 可以配合CAGradientLayer笋敞、CAShapeLayer 使用碱蒙。可以實現(xiàn)蒙層透明度夯巷、顯示不同形狀圖層赛惩、圖案鏤空、文字變色等等功能趁餐。
7.mask在動畫中使用喷兼,可以產(chǎn)生很好的動畫效果。
用法一
作為圖片的遮罩
let backImage = UIImageView(frame: CGRect(x: 0, y: 0, width: KscreenWidth, height: KscreenHeight - 60))
backImage.image = UIImage(named: "R-C (1).jpeg")
backImage.contentMode = .scaleAspectFill
view.addSubview(backImage)
let coverImage = UIImageView(frame: CGRect(x: 0, y: 0, width: KscreenWidth, height: KscreenWidth))
coverImage.center = view.center
coverImage.image = UIImage(named: "R-C.jpeg")
coverImage.contentMode = .scaleAspectFit
view.addSubview(coverImage)
coverImage.isUserInteractionEnabled = true
let pan = UIPanGestureRecognizer(target: self, action: #selector(panAction(_:)))
coverImage.addGestureRecognizer(pan)
/// 圖片的遮罩,修改layer的位置后雷,需要使用layer的 position<位置> 和 anchorPoint<錨點>
maskLayer.frame = CGRect(x: 0, y: 0, width: 200, height: 200)
maskLayer.position = CGPoint(x: KscreenWidth/2, y: KscreenWidth/2)
maskLayer.backgroundColor = UIColor.orange.cgColor
maskLayer.cornerRadius = 100
coverImage.layer.mask = maskLayer
/// 拖動手勢
@objc
func panAction(_ pan: UIPanGestureRecognizer){
let point = pan.translation(in: view)
var frame = maskLayer.frame
frame.origin.x += point.x
frame.origin.y += point.y
maskLayer.frame = frame
pan.setTranslation(.zero, in: view)
}
用法二
UILabel作為遮罩
let converView = UIView(frame: CGRect(x: 0, y: 0, width: 200, height: 200))
converView.backgroundColor = .lightGray
converView.center = view.center
view.addSubview(converView)
let gradLayer = CAGradientLayer()
gradLayer.frame = converView.bounds
gradLayer.startPoint = .zero
gradLayer.endPoint = CGPoint(x: 1, y: 1)
gradLayer.colors = [UIColor.RGB(255, 0, 0), UIColor.RGB(255, 165, 0), UIColor.RGB(255, 255, 0), UIColor.RGB(0, 255, 0), UIColor.RGB(0, 255, 255), UIColor.RGB(0, 0, 255), UIColor.RGB(43, 0, 255), UIColor.RGB(87, 0, 255)]
converView.layer.addSublayer(gradLayer)
let lbl = UILabel()
lbl.text = "你說說這是怎么個事吧你說說這是怎么個事吧你說說這是怎么個事吧你說說這是怎么個事吧你說說這是怎么個事吧你說說這是怎么個事吧你說說這是怎么個事吧你說說這是怎么個事吧你說說這是怎么個事吧你說說這是怎么個事吧你說說這是怎么個事吧你說說這是怎么個事吧"
lbl.numberOfLines = 0
lbl.font = .boldSystemFont(ofSize: 15)
lbl.frame = CGRect(x: 5, y: 5, width: 190, height: 190)
converView.addSubview(lbl)
gradLayer.mask = lbl.layer
用法三
文本顏色分段顯示
let contentView = UIView(frame: CGRect(x: 0, y: 0, width: 280, height: 280))
contentView.center = view.center
view.addSubview(contentView)
let lblBack = UILabel()
lblBack.frame = CGRect(x: 5, y: 5, width: 180, height: 30)
lblBack.text = "你好季惯,早飯吃了嗎"
lblBack.textColor = .black
contentView.addSubview(lblBack)
let lblCover = UILabel()
lblCover.frame = CGRect(x: 5, y: 5, width: 180, height: 30)
lblCover.text = "你好吠各,早飯吃了嗎"
lblCover.textColor = .red
contentView.addSubview(lblCover)
/// 遮罩
let coverLayer = CALayer()
coverLayer.frame = CGRect(x: 30, y: 10, width: 100, height: 30)
coverLayer.backgroundColor = UIColor.orange.cgColor
coverLayer.cornerRadius = 15
lblCover.layer.mask = coverLayer