我在 @ 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)。
代码如下:
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,所以您可以尝试一下。
答案 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()
}