简单地掩盖一个UIView用矩形(Simply mask a UIView with a recta

2019-06-14 17:39发布

我想知道如何简单地掩盖任何形式的一个UIView的可视区域。 所有的答案/教程我读过到目前为止描述与图像,梯度掩蔽或建立圆角这办法比我后更先进。

例如:我有边界(0,0,100,100)一个UIView和欲切除使用掩模的视图的右边一半。 因此,我的荫罩框架将是(0,0,50,100)。

任何想法如何做到这一点简单? 我不希望重写drawRect方法,因为这应该是适用于任何的UIView。

我试过,但它只是使无形的整体视图。

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

Answer 1:

由于从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;


Answer 2:

无需任何面膜在所有。 只要把它变成一个包装观点与较小的框架,并设置clipsToBounds 。

wrapper.clipsToBounds = YES;


Answer 3:

感谢您的回答家伙。

万一有人找不到合适的答案上因此,对于这个问题了几个小时,像我刚才那样,我已经组建了一个工作要点中雨燕2.2 masking / clipping UIViewCGRect / UIBezierPath

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.append(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.append(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)

希望这将一定时间救一个人在未来:)



Answer 4:

很简单的例子在斯威夫特的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;
    }
}

产量



Answer 5:

可选层,其alpha通道被用作掩模,以该层的背景和其过滤的背景合成层的内容的结果之间进行选择。

@属性(保留)的CALayer *掩模

做你想做什么正确的方法是创建maskView相同的帧(0,0,100,100)作为的viewToMask哪一层要屏蔽。 然后,你需要设置clearColor为你想不可见的路径(这将阻止在路径上的观点互动所以要小心视图层次结构)。



Answer 6:

设置MaskToBounds是不够的,例如,在场景中,你必须UIImageView ,其位于内RelativeLayout 。 在你把你的情况UIImageView是附近布局的上边缘,然后你旋转你UIImageView ,它会在布局,它不会被裁剪。 如果该标志设置为true,将裁剪是的,但它也将被裁剪掉UIImageView是布局的中心,这是不是你想要的。

因此,确定的研究maskRect是正确的做法。



文章来源: Simply mask a UIView with a rectangle
标签: ios uiview mask