首先,這不是關於動態單元格的高度。所以不要混淆。Autolay + +根據總行數限制動態桌面高度
我有一個場景我創建了三個卡
- 詳細信息卡:用於位置顯示具體細節
- 圖卡:展示基於選擇
- 更多細節卡不同的圖表:卡顯示更多詳情
下面是上述卡屏幕:
以上屏幕查看層次結構:
- 控制器
- 滾動型
- 卡-1
- 卡-2
- 卡-3 < ----我們有興趣在此卡
- 自定義視圖
- 的TableView
所以我展示這裏最後一張卡片的限制,以上所有卡片都完美無缺!並且沒有限制歧義或警告。
讓我們通過代碼:
首先添加Card-3
到ScrollView
:這裏chartBox
是卡-2和bottomBox
是卡-3
[self.scrollView addConstraints:[NSLayoutConstraint
constraintsWithVisualFormat:@"V:[chartBox(200)]-(10)-[bottomBox]"
options:0
metrics:nil
views:@{@"bottomBox" : self.bottomBox, @"chartBox" : self.chartBox}]];
// Below constraint pin to increase content-size
[self.scrollView addConstraints:[NSLayoutConstraint
constraintsWithVisualFormat:@"V:[bottomBox]-(10)-|"
options:0
metrics:nil
views:@{@"bottomBox" : self.bottomBox}]];
[self.scrollView addConstraints:[NSLayoutConstraint
constraintsWithVisualFormat:@"H:[bottomBox]-(10)-|"
options:0
metrics:nil
views:@{@"bottomBox" : self.bottomBox}]];
二加CustomView
到Card-3
:這裏bluePrintView
是CustomView
_bluePrintView = [[BluePrintView alloc] init];
self.bluePrintView.translatesAutoresizingMaskIntoConstraints = NO;
[self.bottomBox addSubview:self.bluePrintView];
[self.bottomBox addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[bluePrintView]|" options:0 metrics:nil views:@{@"bluePrintView":self.bluePrintView}]];
[self.bottomBox addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[bluePrintView]|" options:0 metrics:nil views:@{@"bluePrintView":self.bluePrintView}]];
CGRect screenRect = [[UIScreen mainScreen] bounds];
CGFloat screenWidth = screenRect.size.width - 20;
NSDictionary *metrices = @{@"width" : [NSNumber numberWithFloat:screenWidth]};
[self.scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(10)-[bottomBox(width)]" options:0 metrics:metrices views:@{ @"bottomBox": self.bottomBox}]];
三加TableView
到CustomView
:
self.tableView.tableFooterView = [[UIView alloc] init];
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[tableView]|" options:0 metrics:nil views:@{@"tableView":self.tableView}]];
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[tableView]|" options:0 metrics:nil views:@{@"tableView":self.tableView}]];
// Height constraint
CGFloat viewHeight = self.bounds.size.height;
self.tableHeightConstraint = [NSLayoutConstraint constraintWithItem:self.tableView
attribute:NSLayoutAttributeHeight
relatedBy:NSLayoutRelationEqual
toItem:nil
attribute:NSLayoutAttributeNotAnAttribute
multiplier:1.0
constant:viewHeight];
[self addConstraint:self.tableHeightConstraint];
[self.tableView addObserver:self forKeyPath:@"contentSize" options:0 context:NULL];
而在觀察者方法我會更新tableHeightConstraint
約束。
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
self.tableHeightConstraint.constant = self.tableView.contentSize.height;
[self.tableView setNeedsLayout];
[self.tableView layoutIfNeeded];
}
嘗試所有可能性後,在這裏結束。警告約束。
(
"<NSLayoutConstraint:0x7fbeb1e7e8e0 V:|-(0)-[UITableView:0x7fbeb2843000] (Names: '|':BluePrintView:0x7fbeb1e7ac30)>",
"<NSLayoutConstraint:0x7fbeb1e7e700 V:[UITableView:0x7fbeb2843000]-(0)-| (Names: '|':BluePrintView:0x7fbeb1e7ac30)>",
"<NSLayoutConstraint:0x7fbeb1e7e9b0 V:[UITableView:0x7fbeb2843000(480)]>",
"<NSLayoutConstraint:0x7fbeb1e81a20 '_UITemporaryLayoutHeight' V:[BluePrintView:0x7fbeb1e7ac30(0)]>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x7fbeb1e7e700 V:[UITableView:0x7fbeb2843000]-(0)-| (Names: '|':BluePrintView:0x7fbeb1e7ac30)>
我解決了這些警告通過從[tableView]
|
行(除去底部約束到上海華盈),但隨後的tableView沒有得到渴望的高度。
任何想法如何獲得完整的tableView高度與任何約束警告。
P.S.所有視圖都是由代碼創建的,沒有XIB沒有故事板佈局。 iOS 9.2
是的,你說得對。該觀察員很快在生命週期中加入。我使用了視圖生命週期方法完成執行後添加計時器和延遲0.5秒的解決方案。它的工作原理。 – Kampai