我有一個簡單的佈局,其中有一個containerView
開始在整個屏幕上。裏面,我有兩個垂直子視圖 - topView (green), botView (orange)
需要相同的高度,應該有50%的高度。NSLayoutConstraint子視圖不會自動調整大小以適應容器視圖
發射後,我從屏幕上向下滑動一個視圖(藍色),導致containerView
調整到較短的高度。
我會希望發生的是,topView
和botView
既能變短,在containerView
內保持其甚至高度,但實際發生的事情是,內部意見沒有調整,儘管有一個約束這樣做。
因爲這段代碼有一些基於代碼的限制,有的IB的,here是一個示例項目,看看它在行動。這是一個被忽略的約束:
NSLayoutConstraint *c1 = [NSLayoutConstraint constraintWithItem:self.topView
attribute:NSLayoutAttributeHeight
relatedBy:NSLayoutRelationEqual
toItem:self.containerView
attribute:NSLayoutAttributeHeight
multiplier:0.5f
constant:0.f];
[self.containerView addConstraint:c1];
,並調整大小視圖代碼:
- (void)resizeViews {
__weak UAViewController *weakSelf = self;
dispatch_async(dispatch_get_main_queue(), ^{
[UIView animateWithDuration:0.25 animations:^{
weakSelf.slideInView.frame = CGRectMake(CGRectGetMinX(weakSelf.view.bounds),
CGRectGetMaxY(weakSelf.view.bounds) - CGRectGetHeight(weakSelf.slideInView.frame),
CGRectGetWidth(weakSelf.view.bounds),
CGRectGetHeight(weakSelf.slideInView.frame));
weakSelf.containerView.frame = CGRectMake(CGRectGetMinX(weakSelf.view.bounds),
CGRectGetMinY(weakSelf.view.bounds),
CGRectGetWidth(weakSelf.view.bounds),
CGRectGetMaxY(weakSelf.view.bounds) - CGRectGetHeight(weakSelf.slideInView.frame));
}];
});
}
什麼我錯在這裏做什麼?
順便說一句,你爲什麼要在'resizeViews'中做'dispatch_async'?這不是必須的(除非你從其他隊列中調用它,如果你這樣做,我會感到驚訝)。但它沒有實際意義,因爲如果你正在做自動佈局,你不應該用'frame'屬性來解決問題。修改您的約束,並讓約束引擎進行適當的「框架」更改。 – Rob
dispatch_async正在從調試應用程序的計時器線程中調用。 – coneybeare