使用约束自动移动 UIView
Posted
技术标签:
【中文标题】使用约束自动移动 UIView【英文标题】:Automatically move UIView with Constraints 【发布时间】:2014-04-21 16:39:49 【问题描述】:我在 UIScrollView 中有一些可展开的视图,当它们展开时,我需要它们下面的所有视图自动向下移动,无论展开的视图展开多少。
我想要发生的事情:(左边是起始位置,右边是换帧后)
实际发生的情况:
其他几个视图也需要移动,它们在黄色视图底部有一个固定的空间。我假设(希望)如果我可以在蓝色视图展开时让黄色视图向下移动,那么它们也会移动。
我正在通过blueView.frame = newFrame;
更新尺寸,其中新框架的高度更大。
有没有一种简单的方法可以通过约束来做到这一点,并且不需要大量的代码?我还没有完全弄清楚。
【问题讨论】:
你现有的布局是通过约束完成的吗? 您是否在 Storyboard 中设置了约束?使用自动布局? 我定位了元素,然后通过控制+拖动在两者之间应用间距约束,然后使用“解决自动布局问题”> 添加缺失的约束。我确实启用了自动布局。 我对约束不熟悉,并认为它们需要的设置比实际看起来要少得多。我认为只需设置垂直间距并更改框架即可使约束起作用,但事实似乎并非如此。我只需要和他们多合作。 【参考方案1】:以下是我最近用于类似目的的代码,
- (void)viewDidLoad
[super viewDidLoad];
_expandableView = [[UIView alloc] init];
_adjacentView = [[UIView alloc] init];
[_expandableView setBackgroundColor:[UIColor redColor]];
[_scrollView addSubview:_expandableView];
_expandableView.translatesAutoresizingMaskIntoConstraints = NO;
[_adjacentView setBackgroundColor:[UIColor blueColor]];
[_scrollView addSubview:_adjacentView];
_adjacentView.translatesAutoresizingMaskIntoConstraints = NO;
NSArray *constraints = nil;
NSDictionary *views = NSDictionaryOfVariableBindings(_expandableView,_adjacentView);
constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[_expandableView]-10-[_adjacentView(==20)]-|" options:0 metrics:nil views:views];
[_scrollView addConstraints:constraints];
constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:[_expandableView(==20)]" options:0 metrics:nil views:views];
heightConstraint = [constraints lastObject];
[_scrollView addConstraints:constraints];
constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[_expandableView(==800)]-|" options:0 metrics:nil views:views];
[_scrollView addConstraints:constraints];
constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[_adjacentView(==800)]-|" options:0 metrics:nil views:views];
[_scrollView addConstraints:constraints];
- (IBAction)expandAction:(id)sender
heightConstraint.constant = heightConstraint.constant+20;
【讨论】:
【参考方案2】:我只是不明白约束所需的工作量(并不是说它太过分了)。 我以为我只需要设置垂直间距,然后将框架更改为蓝色视图就会移动黄色视图。我还必须配置一些其他约束(不使用“添加缺失约束”选项)以删除所有警告,现在它可以按预期工作。
【讨论】:
以上是关于使用约束自动移动 UIView的主要内容,如果未能解决你的问题,请参考以下文章
使用 UIAttachmentBehavior 和自动布局约束拖动 UIView
使用自动布局约束时,UIView 无法通过 UIpangesture 顺利拖动
使用自动布局约束在 UIScrollView 内为 UIView 设置动画