2015-06-14 168 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