[英]Auto-layout constraints not getting respected
我以編程方式創建約束,以便視圖控制器視圖具有背景視圖和工具欄,工具欄位於底部。 我希望背景視圖的高度隨着工具欄高度的增加而降低。 在將背景視圖和工具欄作為子視圖添加到視圖控制器的視圖后,我調用(在 viewDidLoad 中)以下以編程方式設置約束的方法。
- (void)configureConstraintsForBackgroundViewAndToolbar {
[self.backgroundView setTranslatesAutoresizingMaskIntoConstraints:NO];
[self.toolbarComponent setTranslatesAutoresizingMaskIntoConstraints:NO];
UIView *constraintsBackgroundView = self.backgroundView;
UIView *constraintsToolbar = self.toolbarComponent;
NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(
constraintsBackgroundView,
constraintsToolbar);
NSDictionary *metricsDictionary = @{
@"toolbarHeight":[NSNumber numberWithFloat:TOOLBAR_HEIGHT]
};
[NSLayoutConstraint activateConstraints:
[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(0)-[constraintsBackgroundView]-(0)-|"
options:NSLayoutFormatDirectionLeadingToTrailing
metrics:metricsDictionary
views:viewsDictionary]];
[NSLayoutConstraint activateConstraints:
[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(0)-[constraintsToolbar]-(0)-|"
options:NSLayoutFormatDirectionLeadingToTrailing
metrics:metricsDictionary
views:viewsDictionary]];
[NSLayoutConstraint activateConstraints:
[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(0)-[constraintsBackgroundView]-(0)-[constraintsToolbar(>=toolbarHeight)]-(0)-|"
options:NSLayoutFormatDirectionLeadingToTrailing
metrics:metricsDictionary
views:viewsDictionary]];
}
在我嘗試使用以下方法(通過嵌入的文本視圖)更新工具欄的高度之前,這一切正常。 我在這里做錯了什么嗎? 工具欄高度增加但背景視圖的高度沒有縮短(我使用 SparkInspector 進行調試)。 似乎很簡單,在這里遺漏了一些明顯的東西......
- (void)textViewDidChange:(UITextView *)textView {
if (textView != self.toolbarTextView) {
return;
}
CGFloat currentHeight = self.bounds.size.height;
CGSize size = [textView sizeThatFits:CGSizeMake(textView.frame.size.width, textView.frame.size.height)];
CGFloat determinedHeight = fminf(fmaxf(size.height, TOOLBAR_HEIGHT), MAX_TOOLBAR_HEIGHT);
[self setBounds:CGRectMake(0, 0, self.bounds.size.width, determinedHeight)];
[self setNeedsLayout];
}
另外,如果我查詢工具欄和背景視圖的約束,我最初設置的彼此之間的約束沒有出現? 它們確實只顯示視圖控制器的視圖……這對我來說也不合適……?
非常感謝...
如果您使用約束設置布局,則為視圖設置邊界或框架以更新布局是沒有意義的。 而是以一種可以通過更改約束的constant
屬性來編輯布局的方式添加約束
例如:
使用特定約束設置工具欄的高度並將其存儲在屬性中
NSLayoutConstraint *toolBarHeightConstraint = [NSLayoutConstraint constraintWithItem:constraintsToolbar
attribute:NSLayoutAttributeHeight
relatedBy:NSLayoutRelationEqual
toItem:self.view
attribute:NSLayoutAttributeNotAnAttribute
multiplier:1
constant:TOOLBAR_HEIGHT];
然后通過更改約束的常量來更改工具欄的高度。 喜歡:
toolBarHeightConstraint.constant = newHeight;
在您的情況下,您還需要將垂直約束更改為:
[NSLayoutConstraint activateConstraints:
[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(0)-[constraintsBackgroundView]-(0)-[constraintsToolbar]-(0)-|"
options:NSLayoutFormatDirectionLeadingToTrailing
metrics:metricsDictionary
views:viewsDictionary]];
有關更多信息,請查看此答案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.