The containing view (gray border) vertically resizes to fit child views.
Containing view is hidden when child view heights total 0.
5 screenshots
1. View layout before applying constraints
2. 3 child views, heights 100
3. Green view height 0
4. Green and blue view height 0
5. Red view height 20, green view height 40
@implementation ViewController { UIView * cv; //container view, clear w/gray border UIView * tv; //top view, red UIView * mv; //middle view, green UIView * bv; //bottom view, blue NSDictionary * bindings; NSMutableArray * verticalConstraints; } -(void)viewDidLoad { [super viewDidLoad]; [self createControls]; [self setupConstraints]; } -(void)setupConstraints { self.view.translatesAutoresizingMaskIntoConstraints = NO; cv.translatesAutoresizingMaskIntoConstraints = NO; tv.translatesAutoresizingMaskIntoConstraints = NO; mv.translatesAutoresizingMaskIntoConstraints = NO; bv.translatesAutoresizingMaskIntoConstraints = NO; bindings = NSDictionaryOfVariableBindings(cv, tv, mv, bv); verticalConstraints = [NSMutableArray array]; [self setupHorizontalConstraints]; [self setupVerticalConstraints]; } -(void)setupHorizontalConstraints { NSMutableArray * hConstraints = [NSMutableArray array]; //container view [hConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-20-[cv(200)]" options:0 metrics:nil views:bindings]]; //top view [hConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[tv]-|" options:0 metrics:nil views:bindings]]; //match middle view w/top view [hConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[mv(tv)]" options:0 metrics:nil views:bindings]]; //match bottom view w/top view [hConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[bv(tv)]" options:0 metrics:nil views:bindings]]; [self.view addConstraints:hConstraints]; } -(void)setupVerticalConstraints { [self.view removeConstraints:verticalConstraints]; [verticalConstraints removeAllObjects]; [verticalConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[cv]-20-|" options:0 metrics:nil views:bindings]]; //view heights, container vertical margin NSDictionary * metrics = @{ @"th" : @(tv.frame.size.height), @"mh" : @(mv.frame.size.height), @"bh" : @(bv.frame.size.height), @"cm" : @(tv.frame.size.height + mv.frame.size.height + bv.frame.size.height > 0 ? 8 : 0) }; [verticalConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-cm-[tv(th)][mv(mh)][bv(bh)]-cm-|" options:NSLayoutFormatAlignAllCenterX metrics:metrics views:bindings]]; [self.view addConstraints:verticalConstraints]; } //init controls w/temp width and position for general layout, before implementing constraints -(void)createControls { int vWidth = 100; int vHeight = 100; int cHeight = vHeight * 3; cv = [[UIView alloc] initWithFrame:CGRectMake(20, 20, vWidth, cHeight)]; tv = [[UIView alloc] initWithFrame:CGRectMake(10, 0, vWidth, vHeight)]; mv = [[UIView alloc] initWithFrame:CGRectMake(10, 100, vWidth, vHeight)]; bv = [[UIView alloc] initWithFrame:CGRectMake(10, 200, vWidth, vHeight)]; cv.layer.borderColor = [UIColor lightGrayColor].CGColor; cv.layer.borderWidth = 1; tv.backgroundColor = [UIColor redColor]; mv.backgroundColor = [UIColor greenColor]; bv.backgroundColor = [UIColor blueColor]; [self.view addSubview:cv]; [cv addSubview:tv]; [cv addSubview:mv]; [cv addSubview:bv]; } -(void)hideView:(UIView *)aView { aView.frame = CGRectMake(0, 0, aView.frame.size.width, 0); [self setupVerticalConstraints]; } -(void)resizeView:(UIView *)aView height:(int)aHeight { aView.frame = CGRectMake(0, 0, aView.frame.size.width, aHeight); [self setupVerticalConstraints]; } -(void)showView:(UIView *)aView { aView.frame = CGRectMake(0, 0, aView.frame.size.width, 100); [self setupVerticalConstraints]; }
No comments:
Post a Comment