我试图根据约束计算表格视图标题的高度。当我使用layoutMarginsGuide
属性时,调用systemLayoutSizeFittingSize
的大小错误。如果我在不使用边距指南的情况下固定边缘,则可以正常工作。
以下是代码:
class SomeVC: UIViewController, UITableViewDataSource, UITableViewDelegate {
// MARK: Properties
let tableView = UITableView()
let headerView = UIView()
let circle = UIView()
let circleSize: CGFloat = 100
// MARK: Methods
override func viewDidLoad() {
super.viewDidLoad()
tableView.delegate = self
tableView.dataSource = self
tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "cellID")
view.addSubview(tableView)
headerView.layoutMargins = UIEdgeInsetsMake(20, 20, 20, 20)
headerView.backgroundColor = UIColor.grayColor().colorWithAlphaComponent(0.36)
circle.backgroundColor = UIColor.grayColor()
circle.layer.cornerRadius = circleSize/2
headerView.addSubview(circle)
// Constraints for circle
let margins = headerView.layoutMarginsGuide
circle.translatesAutoresizingMaskIntoConstraints = false
circle.topAnchor.constraintEqualToAnchor(margins.topAnchor).active = true
circle.bottomAnchor.constraintEqualToAnchor(margins.bottomAnchor).active = true
circle.centerXAnchor.constraintEqualToAnchor(margins.centerXAnchor).active = true
circle.widthAnchor.constraintEqualToConstant(circleSize).active = true
circle.heightAnchor.constraintEqualToConstant(circleSize).active = true
// Constraints for tableView
tableView.translatesAutoresizingMaskIntoConstraints = false
tableView.topAnchor.constraintEqualToAnchor(view.topAnchor).active = true
tableView.leadingAnchor.constraintEqualToAnchor(view.leadingAnchor).active = true
tableView.bottomAnchor.constraintEqualToAnchor(view.bottomAnchor).active = true
tableView.trailingAnchor.constraintEqualToAnchor(view.trailingAnchor).active = true
// Calculate size for headerView considering all constraints
let size = headerView.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize)
headerView.frame = CGRect(origin: CGPointZero, size: size)
tableView.tableHeaderView = headerView
let size2 = headerView.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize)
print("size:", size.height) // prints wrong height - 100.0
print("size2:", size2.height) // prints correct height - 140.0
}
}
为什么当我第二次致电systemLayoutSizeFittingSize
时,它会给出正确的尺寸?
答案 0 :(得分:0)
所以我认为正在发生的是,虽然您的约束是通过代码更新的,但是tableView的实际布局还没有根据您的约束进行更新。它当然会在视图出现之前更新,但是为了在计算中使用,您需要更新viewDidLoad中的布局。尝试
let size2 = headerView.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize)
tableView.setNeedsLayout()
tableView.layoutIfNeeded()
print("size:", size.height) // prints wrong size - 100.0
print("size2:", size2.height) // prints correct size - 140.0
我会在打印功能测试之前调用它。 随着tableView布局的更新,它应该为frameView及其子视图(如标题)返回正确的帧大小。
答案 1 :(得分:0)
systemLayoutSizeFittingSize
也有类似的问题,尽管可能无关。
视图的安全区域插图尚未在第一次调用(它们全为0)到systemLayoutSizeFittingSize
时设置,也许这也适用于布局边距。后续调用将正确设置安全插入集,这将导致正确的计算。
我认为在您的情况下,唯一的解决方案是坚持不使用边距引导。