2013-01-19 49 views
20

Với mã bên dưới, tôi đã che thành công một phần bản vẽ của mình, nhưng đó là nghịch đảo của những gì tôi muốn đeo mặt nạ. Mặt nạ này là phần bên trong của bản vẽ, nơi tôi muốn che phần bên ngoài. Có cách nào đơn giản để đảo ngược mặt nạ này không?Mặt nạ đảo ngược iOS trong drawRect

myPath bên dưới là UIBezierPath.

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

Trả lời

30

Bạn có thể thêm hình chữ nhật lớn bao phủ toàn bộ khung và sau đó thêm hình dạng bạn đang che. Điều này sẽ có hiệu lực đảo ngược mặt nạ.

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; 
+0

Có thể bạn có thể trả lời câu hỏi này quá: http://stackoverflow.com/questions/30360389/ use-layer-mask-to-make-parts-of-the-uiview-transparent – confile

+0

Câu trả lời này rất tuyệt vời và hoạt động hoàn hảo. –

+0

là CGPathRelease (maskPath) đã bị xóa chưa? nó hoạt động nhưng tôi có thể bị rò rỉ bộ nhớ không? (Swift 2.2, iOS 9.0) Không thể tìm thấy bất kỳ tham chiếu nào đến nó. – Maik639

7

Dựa trên câu trả lời được chấp nhận, đây là một mashup khác trong Swift. Tôi đã thực hiện nó thành một chức năng và thực hiện các tùy chọn 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; 
} 
8

Đối Swift 3,0

func mask(viewToMask: UIView, maskRect: CGRect, invert: Bool = false) { 
    let maskLayer = CAShapeLayer() 
    let path = CGMutablePath() 
    if (invert) { 
     path.addRect(viewToMask.bounds) 
    } 
    path.addRect(maskRect) 

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

    // Set the mask of the view. 
    viewToMask.layer.mask = maskLayer; 
}