2015-06-14 170 views
2

我有這個PNG文件,我想用它作爲UIView的掩碼。Swift:Mask Alignment +自動佈局約束條件

enter image description here

視圖必須是:

  • 20像素/從每個側
  • 一個完全平方
  • 垂直居中點

我設置以下的制約要做到這一點:

enter image description here

但是,看起來這些限制並不能很好地與掩碼一起玩。當這些約束和mask屬性設置,我得到如下:

enter image description here

但我的觀點一樣,看起來就像面具上面,除了橙(這裏的backgroundColor僅僅是simplicity-我後來添加需要被屏蔽子視圖)

然而,當沒有任何限制設置,則mask似乎正常工作,我得到這樣的事情(borderColor添加唯一的視覺目的):

enter image description here

這裏是我的代碼(viewForLayer是我在故事板製作一個UIView):

viewForLayer.layer.borderColor = UIColor.redColor().CGColor 
    viewForLayer.layer.borderWidth = 10 

    var mask = CALayer() 
    mask.contents = UIImage(named: "TopBump")!.CGImage 
    mask.frame = CGRect(x: 0, y: 0, width: viewForLayer.bounds.width, height: viewForLayer.bounds.height) 
    mask.position = CGPoint(x: viewForLayer.bounds.width/2, y: viewForLayer.bounds.height/2) 
    viewForLayer.layer.mask = mask 
    viewForLayer.backgroundColor = UIColor.orangeColor() 

的問題是,雖然,現在的觀點是不正確的大小或在合適的位置,它不不遵循上述規則 - 「觀點必須是:」。 如何才能使mask正常工作,並同時設置自動佈局約束?

+0

你確定這個'viewForLayer'具有正確的尺寸嗎? – Kametrixom

+0

不知道你的意思是正確的大小,但我在故事板中設置了約束,當我運行它時沒有設置圖層的「mask」屬性,它是一個橙色的正方形,佔據與蒙版時完全相同的空間,除了右下角,顯然也是橙色的。 – 5813

+0

嘗試使用邊框插入橙色視圖以查看約束是否正確。我懷疑橙色背景視圖正在擴展,通過屏幕的右邊界。 – Laurent

回答

1

我找到了解決辦法。不知道這是最好的方式,但在這裏我們去...

http://imgur.com/pUIZbNA

只要確保你在故事板檢查改變UIView類的名字了。顯然,訣竅是爲每個layoutSubviews調用設置遮罩幀。

class MaskView : UIView { 

    override func layoutSubviews() { 
    super.layoutSubviews() 
    if let mask = self.layer.mask { 
     mask.frame = self.bounds 
    }   
    } 

} 

class ViewController: UIViewController { 

    @IBOutlet weak var viewForLayer: MaskView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     let image = UIImage(named: "TopBump")!.CGImage! 
     let maskLayer = CALayer() 
     maskLayer.contents = image 
     maskLayer.frame = viewForLayer.bounds 
     viewForLayer.layer.mask = maskLayer 
     viewForLayer.backgroundColor = UIColor.orangeColor() 

     // Do any additional setup after loading the view, typically from a nib. 
     viewForLayer.layer.borderColor = UIColor.redColor().CGColor 
     viewForLayer.layer.borderWidth = 10 


    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

} 
+0

謝謝!但是,我收到了一個我在聊天中發佈的奇怪錯誤。 – 5813

+0

我更新了MaskView代碼來處理BAD_ACCESS情況。 – Laurent

1

我爲自己試了一下。減去'let mask = CALayer()'(它是對可更新對象的不可變引用)的挑剔,改變嵌入視圖的自動佈局約束顯示掩碼正確對齊。

NSLog("\(viewForLayer.bounds.width), \(viewForLayer.bounds.height)") 

在iPhone 6屏幕上返回375.0,667.0。你有什麼?

+0

感謝您的快速響應。查看我剛剛編輯的內容。對於'NSLog',在iPhone 6上,我得到:600.0,600.0。 – 5813