基于Apple的doc,在返回最佳尺寸时,systemLayoutSizeFitting
应该遵守UIView
元素上的当前约束。但是,每当我运行以下代码时,我都会得到{0, 0}
输入的UIView.layoutFittingCompressedSize
和{1000, 1000}
输入的UIView.layoutFittingExpandedSizeSize
。
let mainView = UIView(frame: CGRect(origin: .zero, size: CGSize(width: 375, height: 50)))
mainView.backgroundColor = .red
PlaygroundPage.current.liveView = mainView
let subview = UIView()
subview.backgroundColor = .yellow
mainView.addSubview(subview)
subview.snp.makeConstraints { make in
make.width.equalToSuperview().dividedBy(3.0)
make.left.top.bottom.equalToSuperview()
}
mainView.setNeedsLayout()
mainView.layoutIfNeeded()
subview.frame
subview.systemLayoutSizeFitting(UIView.layoutFittingCompressedSize)
我注意到,如果将width
约束更改为常量,那么我将从systemLayoutSizeFitting
获得有效值。试图了解为什么会发生这种行为,以及是否有可能从systemLayoutSizeFittingSize(_ size: CGSize)
获取正确的值。
答案 0 :(得分:0)
此文档似乎缺少文档。
看来.systemLayoutSizeFitting
高度依赖于元素的.intrinsicContentSize
。对于UIView
,它没有内部内容大小(除非您已覆盖它)。
因此,如果相关约束是另一个约束的 percentage ,则.systemLayoutSizeFitting(UIView.layoutFittingCompressedSize)
将返回{0, 0}
。我认为这是因为相关约束可能会更改(变为零),因此最小值实际上是零。
如果将.width
约束更改为常数(例如mainView.frame.width * 0.3333
),则当恒定宽度约束变为固有宽度时,您将获得有效的尺寸值。
例如,如果子视图是UILabel
,则该元素将具有固有尺寸,并且.systemLayoutSizeFitting
应该返回您期望的尺寸值。 / p>
下面是一个使用UILabel
的示例,该示例将演示:
import UIKit
import PlaygroundSupport
let mainView = UIView(frame: CGRect(origin: .zero, size: CGSize(width: 375, height: 50)))
mainView.backgroundColor = .red
PlaygroundPage.current.liveView = mainView
let v = UILabel()
v.text = "Testing"
v.translatesAutoresizingMaskIntoConstraints = false
v.backgroundColor = .green
mainView.addSubview(v)
NSLayoutConstraint.activate([
v.widthAnchor.constraint(equalTo: mainView.widthAnchor, multiplier: 3.0 / 10.0),
v.leftAnchor.constraint(equalTo: mainView.leftAnchor),
v.topAnchor.constraint(equalTo: mainView.topAnchor),
v.bottomAnchor.constraint(equalTo: mainView.bottomAnchor),
])
mainView.setNeedsLayout()
mainView.layoutIfNeeded()
v.frame
v.systemLayoutSizeFitting(UIView.layoutFittingCompressedSize)