27

以下のコードを使用すると、図面の一部を正常にマスクできますが、これはマスクしたいものの逆です。これにより、図面の内側部分がマスクされ、外側部分がマスクされます。このマスクを反転する簡単な方法はありますか?

myPath以下はUIBezierPathです。

CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
CGMutablePathRef maskPath = CGPathCreateMutable();
CGPathAddPath(maskPath, nil, myPath.CGPath);
[maskLayer setPath:maskPath];
CGPathRelease(maskPath);
self.layer.mask = maskLayer;
4

7 に答える 7

41

シェイプ レイヤー ( ) に偶数の塗りつぶしをmaskLayer.fillRule = kCAFillRuleEvenOdd;使用すると、フレーム全体をカバーする大きな四角形を追加してから、マスク アウトするシェイプを追加できます。これにより、マスクが反転します。

CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
CGMutablePathRef maskPath = CGPathCreateMutable();
CGPathAddRect(maskPath, NULL, someBigRectangle); // this line is new
CGPathAddPath(maskPath, nil, myPath.CGPath);
[maskLayer setPath:maskPath];
maskLayer.fillRule = kCAFillRuleEvenOdd;         // this line is new
CGPathRelease(maskPath);
self.layer.mask = maskLayer;
于 2013-09-09T09:59:44.757 に答える
9

受け入れられた回答に基づいて、Swift の別のマッシュアップを次に示します。私はそれを関数にして、invertオプションにしました

class func mask(viewToMask: UIView, maskRect: CGRect, invert: Bool = false) {
    let maskLayer = CAShapeLayer()
    let path = CGPathCreateMutable()
    if (invert) {
        CGPathAddRect(path, nil, viewToMask.bounds)
    }
    CGPathAddRect(path, nil, maskRect)

    maskLayer.path = path
    if (invert) {
        maskLayer.fillRule = kCAFillRuleEvenOdd
    }

    // Set the mask of the view.
    viewToMask.layer.mask = maskLayer;
}
于 2015-10-20T18:23:09.207 に答える
5

コーナー半径を許可する私のSwift 4.2ソリューションは次のとおりです

extension UIView {

    func mask(withRect maskRect: CGRect, cornerRadius: CGFloat, inverse: Bool = false) {
        let maskLayer = CAShapeLayer()
        let path = CGMutablePath()
        if (inverse) {
            path.addPath(UIBezierPath(roundedRect: self.bounds, cornerRadius: cornerRadius).cgPath)
        }
        path.addPath(UIBezierPath(roundedRect: maskRect, cornerRadius: cornerRadius).cgPath)

        maskLayer.path = path
        if (inverse) {
            maskLayer.fillRule = CAShapeLayerFillRule.evenOdd
        }

        self.layer.mask = maskLayer;
    }

}
于 2019-04-18T08:11:55.293 に答える