使用约束自动移动 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 设置动画

自动布局和 AVPlayerViewController

自动布局:使用 UIWebViews 自定义 UIView 高度约束

添加 UIView 并使用自动布局重新计算约束