我有这个PNG文件,我想将其用作id initWithString(id self, SEL _cmd, NSString *aString);
的掩码。
视图必须是:
我设置了以下约束来完成此任务:
然而,看起来这些限制并不适合使用面具。当设置了这些约束和UIView
属性时,我得到以下内容:
但是我希望视图看起来就像上面的面具,除了橙色(这里的mask
只是为了简单 - 我后来添加了需要屏蔽的子视图。)
但是,如果没有设置约束,backgroundColor
似乎正常工作,我得到类似的内容(mask
仅用于视觉目的):
这是我的代码(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()
正常工作,同时设置自动布局约束?
答案 0 :(得分:1)
我亲自尝试过。减去'let mask = CALayer()'(它是对可更新对象的不可变引用)的挑剔,更改嵌入视图的自动布局约束显示蒙版正确对齐。
NSLog("\(viewForLayer.bounds.width), \(viewForLayer.bounds.height)")
在iPhone 6屏幕上返回375.0,667.0。你有什么收获?
答案 1 :(得分:1)
我找到了解决方法。不确定这是不是最好的方法,但我们走了......
请确保您也在故事板检查器中更改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.
}
}