【问题标题】:Swift mask UIView constraints issuesSwift 掩码 UIView 约束问题
【发布时间】: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


【解决方案1】:

发生这种情况是因为当您从viewDidLoad 调用setupBlur() 时,一开始blurView.bounds 的值来自您正在处理的stroyboard,并且您正在使用这些边界在它们之前设置blurEffectView.frame已针对您设备的屏幕进行了调整。

这不是最好的解决方案,但我希望它能解决您的问题。

试试这个:

override func viewDidLoad() {
    super.viewDidLoad()
    DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
        self.setupBlur()
    }
}

【讨论】:

  • 谢谢!!你是对的。根据您的回答,我能够找到更清洁的解决方案。 override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() self.setupBlur() }
【解决方案2】:
override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    self.setupBlur()
}

【讨论】:

    【解决方案3】:

    就我而言,我尝试了viewDidLayoutSubviews() 而不是DispatchQue,但没有成功。但是,viewDidLoad() 为我工作。

    override func viewDidAppear() {
        self.setupBlur()
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-19
      • 2018-07-18
      • 2021-06-23
      • 2021-01-14
      • 2021-05-21
      • 1970-01-01
      相关资源
      最近更新 更多