如果您想尝试源代码(非常欢迎您这样做),请查看我的Bitbucket 存储库。
我有一个显示设置列表的弹出对话框。这些设置列在多个 UITableViews 中。UITableViews 不能滚动,因为整体设置视图已经是。此外,弹出对话框应根据需要在垂直方向占据尽可能多的屏幕,但应水平压缩。
因此,我构思了以下结构:
UIView => MySettingsViewController
- UIScrollView
- UIView (Content View)
- Container View1
- UITableView (embedded) => MyTableViewController
- Container View2
- UITableView (embedded)
该结构是通过 Interface Builder 组装的,Autolayout 用于调整大小。
我有滚动视图、内容视图(我从一个开始)和容器视图到它们各自的超级视图(或布局指南)。我通过以下方式限制了内容视图的大小:
contentView.width == (topmost) UIView.width
contentView.height == 200 // removed at build time
此外,我将表格视图的大小设置为其内容大小,否则弹出框似乎为空:
class MyTableViewController: UITableViewController {
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
// this is Cartography syntax - the intention should be clear
layout(view, replace: ConstraintGroup()) { [unowned self] view in
view.width == self.tableView.contentSize.width
view.height == self.tableView.contentSize.height
}
view.setNeedsLayout()
}
}
设置弹出框充满了内容,但它的大小不太正确:
为了解决这个问题,我尝试了以下不起作用的方法:
class MySettingsViewController: UIViewController {
override var preferredContentSize: CGSize {
get {
let compressedSize = view.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize)
// this is always (0, 0) because the subviews are not resized, yet
return compressedSize
}
set {
super.preferredContentSize = newValue
}
}
}
总结:压缩不起作用。