gpt4 book ai didi

swift - @3x 设备上的 UIView 帧不正确

转载 作者:行者123 更新时间:2023-11-28 07:42:23 25 4
gpt4 key购买 nike

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

我坚持使用视觉这个词,因为当我打印出那个特定 View 的框架时,一切都是正确的。

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

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

View B 以其父 View ( View A)为中心。

真的很简单吧?

View 框架 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 设备上进行测试时,视觉上, View 的 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()

问题解决了。但这不是解决办法。我希望该 View 在其父 View 中完全居中。

我该如何解决这个问题?

我创建了一个 demo project所以你可以试试看。

最佳答案

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

第一名:

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()
}

而是 覆盖 func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
}

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

关于swift - @3x 设备上的 UIView 帧不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51966758/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com