UIView @ 3x设备上的框架不正确

时间:2018-08-22 12:19:15

标签: swift layout uiview cgrect

我在 @ 3x设备上确实有一个奇怪的错误,其中UIView的大小在视觉上不正确。

我坚持使用 一词,因为当我打印出该特定视图的框架时,一切都正确。

在@ 2x设备上,一切看起来都很好。

我的视图层次结构非常简单。我在另一个视图(视图B)中有一个视图(视图A)。

视图B位于其超级视图(视图A)的中心。

真的很简单吧?

视角B应为:
CGRect(x: 8.5, y: 15.5, width: 19.0, height: 5.0)

如果我们将其缩放3倍(以在@ 3x设备上获得其实际尺寸),则我们应该有一个带有以下框架的矩形:
CGRect(x: 25.5, y: 46.5, width: 57.0, height: 15.0)


在@ 3x设备上进行测试时,在视觉上,视图的origin.x为26px(而不是25.5),宽度为56px(而不是57px)。

Frame issue

代码如下:

class ViewController: UIViewController {

    private static let centeredViewSize = CGSize(width: 36, height: 36)

    private let centeredView = UIView(frame: .zero)
    private let rectangleView = UIView(frame: .zero)

    // MARK: - View Lifecycle

    override func viewDidLoad() {
        super.viewDidLoad()

        self.rectangleView.clipsToBounds = true
        self.rectangleView.backgroundColor = UIColor.purple

        self.centeredView.backgroundColor = UIColor.red
        self.centeredView.addSubview(self.rectangleView)

        self.view.addSubview(self.centeredView)
    }

    // MARK: - Layout

    override func viewWillLayoutSubviews() {
        super.viewWillLayoutSubviews()

        self.centeredView.frame.size = ViewController.centeredViewSize
        self.centeredView.center = self.view.center

        let rectangleViewSize = CGSize(width: 19, height: 5)
        let rectangleViewHorizontalOrigin = self.centeredView.bounds.midX - (rectangleViewSize.width / 2)
        let rectangleViewVerticalOrigin = self.centeredView.bounds.midY - (rectangleViewSize.height / 2)
        let rectangleViewOrigin = CGPoint(x: rectangleViewHorizontalOrigin, y: rectangleViewVerticalOrigin)
        self.rectangleView.frame = CGRect(origin: rectangleViewOrigin, size: rectangleViewSize)
    }
}

这整个问题似乎来自水平起源。
如果我这样舍入:

let rectangleViewHorizontalOrigin = (self.centeredView.bounds.midX - (rectangleViewSize.width / 2)).rounded()

问题消失了。但这不是解决方案。我希望该视图在其超级视图中完美居中。

我该如何解决?

我创建了一个demo project,所以您可以尝试一下。

1 个答案:

答案 0 :(得分:0)

我运行您的代码。您的框架在任何设备上都完美居中。 我只有两件事改变了。

第一名:

override func viewDidLoad() {
    super.viewDidLoad()

      // Change the order of adding subviews
      self.view.addSubview(self.centeredView)
      self.centeredView.addSubview(self.rectangleView)
}

第二:

我使用override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() }

代替override func viewWillLayoutSubviews() { super.viewWillLayoutSubviews() }

如果出现问题,请使用新的屏幕截图编辑您的问题。 这是我的控制台输出。 enter image description here