当Autolayout打开时如何以编程方式改变UIViews的位置

时间:2015-09-07 01:31:08

标签: ios objective-c cocoa-touch uiview ios-autolayout

我已经坚持这个问题很长一段时间了。在objective-c中开发iOS应用程序时,如何在启用Autolayout时以编程方式更改UIViews的位置(位置)?没有Autolayout就这么容易,因为我们只是为UIView指定一个新的中心:

UIView.center = CGPointMake(x,y);

然而,由于Autolayout,以上不再适用。最后,我试图通过使用从左到右的平移变换来动画某个UIView。为了做到这一点,我需要以编程方式移动UIViews,这是我目前无法做到的。以下是我尝试基本上做的事情(但由于自动布局不起作用):

_loginTextLabel.center = CGPointMake(1,1);

[UIView animateWithDuration:0.5 delay:0.5 options:nil animations:^{
    _loginTextLabel.center= CGPointMake(5, 1);

} completion:nil
 ];
}

2 个答案:

答案 0 :(得分:1)

实际上,您可以在- (void)viewDidLayoutSubviews(或- (void)layoutSubviews,如果它在您的自定义视图中)布局您的_loginTextLabel而不使用自动布局,那么您可以像以前一样动画您的视图而不需要任何麻烦。

如果您使用Nib中的autolayout布局视图,那么您可以像Abhishek所说的那样创建约束的出口,基本上是这样的:

[self.view layoutIfNeeded];
yourConstraint.constant = whateverYouWant;
[UIView animateWithDuration:1.0 animations:^{ 
   [containerView layoutIfNeeded]; }
];

或者,如果您以编程方式创建约束,请按照Apple建议:https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/AutolayoutPG/AutolayoutPG.pdf

它基本上就像你从Nib那样做的,不同之处在于你只是在动画块中改变你的约束

[containerView layoutIfNeeded]; 
[UIView animateWithDuration:1.0 animations:^{
// Make all constraint changes here
[containerView layoutIfNeeded]; // Forces the layout of the subtree animation
block and then captures all of the frame changes
}];

答案 1 :(得分:0)

为了以编程方式处理Autolayouts,您需要创建约束的IBOutlets,它们是类NSLayoutConstraints,并且您想要更改在视图上调用updateConstraintsIfNeeded所需的位置或框架。然后您需要设置浮点值到插座的Constant属性。

_constraintHeight.constant = 200;