ソース コードを試してみたい場合 (大歓迎です)、私のBitbucketリポジトリをご覧ください。
設定のリストを表示するポップオーバー ダイアログがあります。これらの設定は、複数の UITableViews 内にリストされています。UITableViews は、全体的な設定ビューが既にスクロール可能であるため、スクロール可能であってはなりません。さらに、ポップオーバー ダイアログは垂直方向に必要なだけ画面を占有しますが、水平方向には圧縮されます。
そこで、次のような構造を考えました。
UIView => MySettingsViewController
- UIScrollView
- UIView (Content View)
- Container View1
- UITableView (embedded) => MyTableViewController
- Container View2
- UITableView (embedded)
構造は Interface Builder を介して組み立てられ、サイズ設定には Autolayout が使用されます。
スクロール ビュー、コンテンツ ビュー (1 つだけから始めました)、およびコンテナー ビューの両方をそれぞれのスーパービュー (またはレイアウト ガイド) に持っています。次の方法でコンテンツ ビューのサイズを制限しました。
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
}
}
}
結論: 圧縮は機能しません。