我正在建立一个UIPageViewController,它具有基于视图数组中视图高度的可变页面数。
我有一个叫做BlockView
的类,看起来像这样:
final class BlockView: UIView {
init(viewModel: BlockViewModel) {
super.init(frame: .zero)
let primaryLabel = UILabel()
primaryLabel.text = viewModel.labelText
addSubview(primaryLabel)
constrain(primaryLabel) {
$0.top == $0.superview!.top + 8
$0.bottom == $0.superview!.bottom - 8
$0.left == $0.superview!.left + 8
$0.right == $0.superview!.right - 8
}
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
我想做的是遍历我的BlockViews数组并运行
print(blockView.frame)
并查看不为零的帧。现在,我知道将
frame
设置为.zero
内的BlockView.init
。那是因为我希望视图根据其标签来调整自身大小。我需要运行一个功能来实现这一目标吗?
谢谢
最佳答案
尝试使用 sizeThatFits(_:)
进行计算,而不将其置于 super 视图中。该方法的唯一参数是CGSize
,它表示应在其中显示的边界。例如,如果您知道 super 视图的宽度(例如340个点),并且想知道它在高度上将占多少:
let expectedSize = view.sizeThatFits(CGSize(width: 340, height: .greatestFiniteMagnitude))
但是,您的
BlockView
似乎尚未设置适当的约束。您使用super.init(frame: .zero)
对其进行初始化-因此其大小为0,0。而且您的约束不会改变这一点,例如:
constrain(primaryLabel) {
$0.centerY == $0.superview!.centerY
$0.left == $0.superview!.left + 8
}
看起来您将标签的Y轴中心设置为块视图的中心,标签的左锚点设置为视图的左锚。如果
blockView
已经具有大小,则可以正确放置标签。但是现在,块视图的大小完全不受标签大小的影响。我猜您可能希望将标签限制在blockView
的左右,左,右,上和下锚点,以便当您尝试计算blockView
的大小时,自动布局必须首先计算标签的大小并根据在此blockView
本身的大小。您可以尝试将其放入
BlockView
的初始化程序的一种可能的解决方案(我正在使用基于锚的自动布局语法):primaryLabel.leftAnchor.constraint(equalTo: self.leftAnchor, constant: 8).isActive = true
primaryLabel.topAchor.constraint(equalTo: self.topAnchor, constant: 8).isActive = true
primaryLabel.rightAnchor.constraint(equalTo: self.rightAnchor, constant: -8).isActive = true
primaryLabel.bottomAnchor.constraint(equalTo: secondaryLabel.topAnchor, constant: -8).isActive = true
secondaryLabel.leftAnchor.constraint(equalTo: self.leftAnchor, constant: 8).isActive = true
secondaryLabel.rightAnchor.constraint(equalTo: self.rightAnchor, constant: -8).isActive = true
secondaryLabel.bottomAnchor.constraint(equalTo: self.bottomAnchor, constant: -8).isActive = true