如何使用Autolayout动态调整视图高度的视图高度?

时间:2015-04-25 14:14:02

标签: ios objective-c ios7 autolayout

我有一种情况,其中Window有2个子视图A和B,A视图包含2个子视图A1和A2。我必须根据A1和A2是否可用来显示View A的高度。 示例:如果A1可用,那么A2不是预期A的高度是A1高度+填充。并根据视图A和B之间的垂直间距约束重新调整视图B的高度。 - 如果A1和A2都可用,则A' height = A1 height + padding + A2 height + padding。并且基于垂直间距约束,相同的B高度重新调整。

___________________________
| _________________________
| | A _____________________ 
| |  |_A1__________________
| |  ______________________
| | |__A2__________________
| |________________________
|
|  ________________________
| |  B
| | 
| |________________________
|
|
|__________________________


___________________________
| _________________________
| | A _____________________ 
| |  |_A1__________________
| |________________________
|
|  ________________________
| |  B
| | 
| |________________________
|
|
|__________________________

2 个答案:

答案 0 :(得分:0)

我认为您已自定义了名为LiveView的视图,其中包含您描述的所有视图。我在下面放了一些代码,稍后再解释一下。



@implementation LiveView

- (id)init {
    self = [super init];
    if (!self) return nil;
    
    // Iniitlize your view hierarchy
    
    return self;
}

+ (BOOL)requiresConstraintBasedLayout
{
    return YES;
}

// this is Apple's recommended place for adding/updating constraints
- (void)updateConstraints {
    // Define or update your constraints

    // tell constraints they need updating
    [self setNeedsUpdateConstraints];
    
    // update constraints now so we can animate the change
    [self updateConstraintsIfNeeded];
    
    [UIView animateWithDuration:0.4 animations:^{
        [self layoutIfNeeded];
    }];
}




如您所见,您应该在- (id)init中初始化视图层次结构。并覆盖+ (BOOL)requiresConstraintBasedLayout方法并返回YES。然后覆盖应该定义或更新约束的- (void)updateConstraints方法。当您调用方法- (void)updateConstraints中将更新约束和布局的所有方法时。

答案 1 :(得分:-1)

<强> 1。您可以使用代码

提供框架

viewA1.frame = [self frameForViewA1];

viewA2.frame = CGRectZero;

viewA.frame = CGRectMake(0.0f, 0.0f, DESIRED_WIDTH, viewA1.frame.size.height + DESIRED_PADDING + viewA2.frame.size.height);

<强> 2。您可以使用容器视图

UIView containerView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, DESIRED_WIDTH, viewA1.frame.size.height + DESIRED_PADDING + viewA2.frame.size.height)];

然后为视图A添加自动布局约束以适合containerView高度。