【问题标题】:Creating a UIView programmatically以编程方式创建 UIView
【发布时间】:2018-06-04 12:59:24
【问题描述】:

如果我创建一个带有类似 UIView(frame:..) AND 的框架的 UIView 也在此视图上设置约束,框架尺寸是否会优先于约束? iOS 运行时会忽略约束吗?

我在viewDidLoad() 中创建了一个带有框架的 UIView,并将约束附加到该视图。然而,约束并没有被强制执行,视图在传递给初始化程序的框架中呈现。

[编辑]

我的代码如下。我正在尝试在覆盖整个屏幕的 UIView(previewContainer,配置了情节提要上的约束)之上以编程方式将覆盖添加到 AVCaptureVideoPreviewLayer(viewPreviewLayer)。

....

var videoPreviewLayer:AVCaptureVideoPreviewLayer!
   @IBOutlet weak var previewContainer: UIView!
   ....
    override func viewDidLoad() {
      .....
      self.configurePreviewLayer()
    }

 override func viewDidLayoutSubviews() {
        print("viewDidLayoutSubviews")
        super.viewDidLayoutSubviews()
        self.videoPreviewLayer.frame = self.previewContainer.bounds

    }

    func configurePreviewLayer() {
            print("configurePreviewLayer()")
            self.videoPreviewLayer = AVCaptureVideoPreviewLayer(session: self.captureSession)
            self.videoPreviewLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill
            self.previewContainer.layer.addSublayer(self.videoPreviewLayer)

            configureBlurView()
        }

func configureBlurView() {
        print("configureBlurView()")

        // Blur View

        let viewFinderRadius:CGFloat = self.view.bounds.width / 2.0 - 16.0

        print("configureBlurView:\(self.previewContainer.bounds.size.height)")

        let blurView = createOverlay(frame:self.previewContainer.bounds,xOffset: self.view.bounds.size.width / 2.0, yOffset: self.view.bounds.size.height / 2.0, radius: viewFinderRadius)

        blurView.translatesAutoresizingMaskIntoConstraints = false

        self.previewContainer.addSubview(blurView)

        self.blurView = blurView

        blurView.leftAnchor.constraint(equalTo: self.previewContainer.leftAnchor).isActive = true
        blurView.topAnchor.constraint(equalTo:self.previewContainer.topAnchor).isActive = true
        blurView.rightAnchor.constraint(equalTo:self.previewContainer.rightAnchor).isActive = true
        blurView.bottomAnchor.constraint(equalTo:self.previewContainer.bottomAnchor).isActive = true

}

func createOverlay(frame : CGRect, xOffset: CGFloat, yOffset: CGFloat, radius: CGFloat) -> UIView
    {
        let overlayView = UIView(frame: frame)

        overlayView.backgroundColor = UIColor.black.withAlphaComponent(0.7)

        let path = CGMutablePath()
        path.addArc(center: CGPoint(x: xOffset, y: yOffset), radius: radius, startAngle: 0.0, endAngle: 2.0 * CGFloat.pi, clockwise: false)
        path.addRect(CGRect(origin: .zero, size: overlayView.frame.size))

        let maskLayer = CAShapeLayer()
        maskLayer.backgroundColor = UIColor.black.cgColor
        maskLayer.path = path
        maskLayer.fillRule = kCAFillRuleEvenOdd

        overlayView.layer.mask = maskLayer
        overlayView.clipsToBounds = true

        return overlayView
    }

这是渲染屏幕的外观(如您所见,覆盖并没有覆盖整个屏幕,或者换句话说,previewContainer 的整个边界)-

[更新]

我可能找到了罪魁祸首。正是这段代码掩盖了覆盖 -

let path = CGMutablePath()
        path.addArc(center: CGPoint(x: xOffset, y: yOffset), radius: radius, startAngle: 0.0, endAngle: 2.0 * CGFloat.pi, clockwise: false)
        path.addRect(CGRect(origin: .zero, size: overlayView.frame.size))

        let maskLayer = CAShapeLayer()
        maskLayer.backgroundColor = UIColor.black.cgColor
        maskLayer.path = path
        maskLayer.fillRule = kCAFillRuleEvenOdd
        overlayView.layer.mask = maskLayer

如果我删除上面的掩码,一切都会正确呈现。现在我需要弄清楚如何绘制那个蒙版(相机的取景器)。

【问题讨论】:

  • 显示。您的。代码。
  • @matt 请参见上文。我用代码和屏幕截图更新了我的帖子。

标签: ios iphone uiview autolayout ios-autolayout


【解决方案1】:

iOS 运行时会忽略约束吗?

如果约束设置正确,否:它将忽略frame。但是,你没有展示你做了什么,所以不可能说出你看到了什么以及为什么。

【讨论】:

  • 请见上文。我用代码和屏幕截图更新了我的帖子。
  • 好吧,您的问题比问题似乎表明的要复杂得多;基本上你已经问了一个 x-y 问题(询问关于问题是什么的假设,而不是询问实际问题)
  • 好像是这样。你能让我知道我做错了什么来达到我打算创造的东西吗?如您所见,我想在相机视图上创建一个叠加层。我还想最终在覆盖层上附加标签等。
  • 我做出这个假设的原因是,当我从初始化程序中删除框架时,覆盖层正确呈现。这可能是因果关系,但不是一个疯狂的假设。非常感谢任何帮助。
  • 我还是不明白。如果你知道如何让它发挥作用,那就让它发挥作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-01
  • 2011-06-08
  • 2021-10-21
  • 1970-01-01
  • 2018-08-22
  • 1970-01-01
相关资源
最近更新 更多