【发布时间】:2020-03-18 18:42:47
【问题描述】:
我为我的相机屏幕创建了一个遮罩视图,它模糊了除了中间的一个小矩形之外的所有内容。在不同的屏幕尺寸上进行测试时遇到问题。我在 11 Pro 和 8 上进行测试。如果我的故事板视图选择了正确的设备,则设备上的约束看起来很好。但是如果我在没有改变情节提要的情况下换手机,那就不正确了。我正在以编程方式创建遮罩视图。任何帮助将不胜感激!
func setupBlur() {
if !UIAccessibility.isReduceTransparencyEnabled {
blurView.backgroundColor = .clear
let blurEffect = UIBlurEffect(style: .dark)
let blurEffectView = UIVisualEffectView(effect: blurEffect)
blurEffectView.frame = blurView.bounds
blurEffectView.translatesAutoresizingMaskIntoConstraints = false
blurEffectView.addConstraints(blurView.constraints)
blurView.addSubview(blurEffectView)
let maskView = UIView(frame: blurView.bounds)
maskView.translatesAutoresizingMaskIntoConstraints = false
maskView.addConstraints(blurView.constraints)
maskView.backgroundColor = .clear
let outerbezierPath = UIBezierPath.init(rect: blurView.bounds)
let croppedOriginX = (blurView.bounds.width / 2) - (captureView.bounds.width / 2)
let croppedOriginY = (blurView.bounds.height / 2) - (captureView.bounds.height / 2)
let frame = CGRect(x: croppedOriginX, y: croppedOriginY, width: captureView.bounds.width, height: captureView.bounds.height)
let innerRectPath = UIBezierPath.init(rect: frame)
outerbezierPath.append(innerRectPath)
outerbezierPath.usesEvenOddFillRule = true
let fillLayer = CAShapeLayer()
fillLayer.fillRule = kCAFillRuleEvenOdd
fillLayer.fillColor = UIColor.green.cgColor // any opaque color would work
fillLayer.path = outerbezierPath.cgPath
maskView.layer.addSublayer(fillLayer)
blurView.mask = maskView;
}
}
【问题讨论】:
-
添加 blurView 后,尝试调用 view.layoutIfNeeded() 。
-
我假设你正在尝试对 maskView 应用与
maskView.addConstraints(blurView.constraints)在 blurview 上已经存在的相同的约束?我认为这不会按预期工作,因为约束与创建它们的视图/锚相关,而不是适用于任何视图的通用锚。尝试明确设置约束。 -
故事板中的 blurView 设置了哪些约束?
标签: ios swift xcode user-interface constraints