Swift:蒙版对齐+自动布局约束

时间:2015-06-14 16:57:18

标签: swift calayer mask

我有这个PNG文件,我想将其用作id initWithString(id self, SEL _cmd, NSString *aString); 的掩码。

enter image description here

视图必须是:

  • 每边20像素/点
  • 完美的广场
  • 垂直居中

我设置了以下约束来完成此任务:

enter image description here

然而,看起来这些限制并不适合使用面具。当设置了这些约束和UIView属性时,我得到以下内容:

enter image description here

但是我希望视图看起来就像上面的面具,除了橙色(这里的mask只是为了简单 - 我后来添加了需要屏蔽的子视图。)

但是,如果没有设置约束,backgroundColor似乎正常工作,我得到类似的内容(mask仅用于视觉目的):

enter image description here

这是我的代码(borderColor是我在故事板中制作的UIView):

viewForLayer

问题是,现在视图的大小不正确或位置不正确 - 它不符合上述规则 - “视图必须是:”。 如何让 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() 正常工作,同时设置自动布局约束?

2 个答案:

答案 0 :(得分:1)

我亲自尝试过。减去'let mask = CALayer()'(它是对可更新对象的不可变引用)的挑剔,更改嵌入视图的自动布局约束显示蒙版正确对齐。

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

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

答案 1 :(得分: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.
    }

}