只需用一个矩形掩盖一个UIView

我想知道如何简单地掩盖任何types的UIView的可见区域。 到目前为止,我所读到的所有答案/教程都描述了用图像,渐变或者创build比我之前更先进的圆angular的蒙版。

例如:我有一个边界(0,0,100,100)的UIView,我想用一个掩码去掉视图的右半部分。 所以我的掩码框架将是(0,0,50,100)。

任何想法如何做到这一点? 我不想重写drawable方法,因为这应该适用于任何UIView。

我已经尝试过,但只是使整个视图看不见。

CGRect mask = CGRectMake(0, 0, 50, 100); UIView *maskView = [[UIView alloc] initWithFrame:mask]; viewToMask.layer.mask = maskView.layer; 

感谢来自MSK的链接,这是我与之合作的方式:

 // Create a mask layer and the frame to determine what will be visible in the view. CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init]; CGRect maskRect = CGRectMake(0, 0, 50, 100); // Create a path with the rectangle in it. CGPathRef path = CGPathCreateWithRect(maskRect, NULL); // Set the path to the mask layer. maskLayer.path = path; // Release the path since it's not covered by ARC. CGPathRelease(path); // Set the mask of the view. viewToMask.layer.mask = maskLayer; 

根本不需要任何面具。 只要把它放在一个较小的框架的包装视图 ,并设置clipsToBounds 。

 wrapper.clipsToBounds = YES; 

谢谢你的答案。

如果有人在这个问题上几个小时没有find合适的答案,就像我刚刚做的那样,我已经在Swift 2.2中组装了一个工作要点,用于通过CGRect / UIBezierPathmasking / clipping UIView

https://gist.github.com/Flar49/7e977e81f1d2827f5fcd5c6c6a3c3d94

 extension UIView { func mask(withRect rect: CGRect, inverse: Bool = false) { let path = UIBezierPath(rect: rect) let maskLayer = CAShapeLayer() if inverse { path.appendPath(UIBezierPath(rect: self.bounds)) maskLayer.fillRule = kCAFillRuleEvenOdd } maskLayer.path = path.CGPath self.layer.mask = maskLayer } func mask(withPath path: UIBezierPath, inverse: Bool = false) { let path = path let maskLayer = CAShapeLayer() if inverse { path.appendPath(UIBezierPath(rect: self.bounds)) maskLayer.fillRule = kCAFillRuleEvenOdd } maskLayer.path = path.CGPath self.layer.mask = maskLayer } } 

用法:

 let viewSize = targetView.bounds.size let rect = CGRect(x: 20, y: 20, width: viewSize.width - 20*2, height: viewSize.height - 20*2) // Cuts rectangle inside view, leaving 20pt borders around targetView.mask(withRect: rect, inverse: true) // Cuts 20pt borders around the view, keeping part inside rect intact targetView.mask(withRect: rect) 

希望将来可以节省一些时间:)

一个可选的图层,其alpha通道被用作蒙板来select图层的背景和图层内容与其过滤背景的合成结果。

@属性(保留)CALayer *掩码

要做你想做的正确的方法是创build相同的框架( viewToMask )的viewToMask作为viewToMask你想要掩盖的层。 然后,您需要为您想要隐藏的path设置clearColor(这将阻止path上的视图交互,因此请注意视图层次结构)。

Swift ViewController中的一个非常简单的例子,基于接受的答案:

 import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() let redView = UIView(frame: view.bounds) view.addSubview(redView) view.backgroundColor = UIColor.greenColor() redView.backgroundColor = UIColor.redColor() mask(redView, maskRect: CGRect(x: 50, y: 50, width: 50, height: 50)) } func mask(viewToMask: UIView, maskRect: CGRect) { let maskLayer = CAShapeLayer() let path = CGPathCreateWithRect(maskRect, nil) maskLayer.path = path // Set the mask of the view. viewToMask.layer.mask = maskLayer; } } 

产量

在这里输入图像说明

设置MaskToBounds是不够的,例如,在UIImageView位于RelativeLayout内的场景中。 如果你把你的UIImageView放在布局的顶边附近,然后你旋转你的UIImageView ,它会超过布局,它不会被裁剪。 如果将该标志设置为true,则会裁剪为yes,但如果UIImageView位于布局的中心,则裁剪也将裁剪,而这不是您想要的。

所以,确定maskRect是正确的方法。

Interesting Posts