2013-11-01 24 views
3

我正在练习自动布局和学习动画约束。iOS - 限制在viewdidload中以意想不到的方式动画?

我的第一个问题是。如果我动态地添加视图,将它们的约束动态添加到父视图似乎也很麻烦。有没有任何干净的方式来实现灵活的布局,可以通过编程方式添加和删除视图?或者这意味着我应该想出一个更简单的解决方案来实现我想要完成的任务?

第二个问题。我创建了两个视图,还有一些代码约束。我只是试图调整负载上的第一个视图的高度约束,以便它变得更短,第二个视图将相应地向上移动。

这里是一些代码:

first = [[UIView alloc]initWithFrame:CGRectZero]; 

[first setBackgroundColor:[UIColor blueColor]]; 

[first setTranslatesAutoresizingMaskIntoConstraints:NO]; 

[self.view addSubview:first]; 



UIView *second = [[UIView alloc]initWithFrame:CGRectZero]; 

[second setBackgroundColor:[UIColor redColor]]; 

[second setTranslatesAutoresizingMaskIntoConstraints:NO]; 

[self.view addSubview:second]; 



NSLayoutConstraint *leading = [NSLayoutConstraint constraintWithItem:first attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeLeading multiplier:1 constant:20]; 

NSLayoutConstraint *trailing = [NSLayoutConstraint constraintWithItem:first attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeTrailing multiplier:1 constant:-20]; 


top = [NSLayoutConstraint constraintWithItem:first attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeTop multiplier:1 constant:40]; 

height = [NSLayoutConstraint constraintWithItem:first attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1 constant:80]; 

[self.view addConstraints:@[leading,trailing,top,height]]; 

[height setConstant:10]; 

[UIView animateWithDuration:0.5 animations:^{ 

    [self.view layoutIfNeeded]; 

}]; 

好了,所以在这里的底部我跑我的动画..我的第二个观点是已经定位哪里会在动画的结尾。第一个视图从左上角扩展到右下角。它对角动画并以10的高度结束。

任何人都可以解释这种行为。我注意到,如果我分配约束,并使它们在IBAction上有动画(按钮触摸),那么它将按预期动画。

回答

3

第二个问题先。你为什么在viewDidLoad改变动画?此时我们知道该视图已加载,但它可能没有布置,并且绝对不会被用户看到;考虑viewDidLayoutSubviews方法中的约束布局更改。

至于第一个问题。大卫H的回答是一种方式......并且是一种完美的方式。为了给出不同的选择,我使用constraintsWithVisualFormat:options:metrics:views:,它允许我指定视图,然后在所有视图中创建所有必要的约束条件。它可以是在多个视图中创建约束的简单方法。具体取决于你在做什么,可能更适合你的需求。

编辑基于评论...

的东西,你就必须打破限制,你仍然必须找到和创造新的突破之前的限制。这是没有办法的。您要么对要破坏的约束进行引用,要么必须遍历对象上的所有约束才能找到它。 A B C去往A B和C,B和C之间的约束消失了。使用视觉格式来放置X可能类似于@“[B] -20- [X] -20- [C]”,它将为B和X之间的20点间隔创建一个约束,第二个约束将会是X和C之间的20点间隔。作为说明,上面的视觉格式仅指定水平定位/间距。您需要第二行来指定垂直约束。

+0

感谢我想我需要发挥它多一点 – hamobi

+0

我想我的问题是..如果IM添加其他视图之间的意见..想,如果我有看法 一个 乙 Ç ,然后我想在他们之间的这种方式来增加随机视图X 一个 乙 X ç 然后我要更新视图B和C,的限制使用与创建十限制,这似乎真的很麻烦 – hamobi

+0

感谢沿更新的信息。欣赏它 – hamobi

2

我正在做类似的事情,并且可以扩展该技术。对于每个视图(实际上,任何对象),创建一个带有“视图”和“约束”属性的可变字典。视图只是视图,约束是包含两个对象的词典数组,一个“视图”属性和一个“约束”属性。

当您决定添加或拉取一个视图,然后找到具有适当视图属性的字典,然后遍历约束数组,并将约束(类型NSLayerConstraint)添加/删除到姐妹“视图”属性词典。

以这种方式,您可以在一种方法中添加和删除所有适当的约束,而不管它们所影响的是什么。

很明显,您只需要在主视图中只有引用视图的约束。但是,另一种处理方法是将视图的宽度/高度设置为0,但仍然存在但不可见。或将其alpha修改为0.

相关问题