2015-09-07 29 views
1

我一直坚持这个问题相当长一段时间了。在Objective-C中开发iOS应用程序时,如何在启用Autolayout时以编程方式更改UIViews的位置(位置)?它是如此不容易,因为自动布局我们刚才指定的UIView作为这样一个新的中心:如何以编程方式更改UIViews在Autolayout打开时的位置

UIView.center = CGPointMake(x,y); 

然而,以上不再起作用,因为自动布局的。最终,我试图通过使用从左到右的转换转换来为某个UIView设置动画。为了做到这一点,我需要以编程方式移动UIViews,目前我无法做到这一点。下面的是什么,我想基本上是做(但它不会因为自动布局的工作):

_loginTextLabel.center = CGPointMake(1,1); 

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

} completion:nil 
]; 
} 
+0

在这篇文章中有几个有趣的想法:http://stackoverflow.com/questions/11368440/can-i-disable-autolayout-for-a-specific-subview-at-runtime一个简单的地方开始,尝试在设置新中心之前设置'translatesAutoresizingMaskIntoConstraints = YES'。 –

+0

@WilliamSmith另外一个问题。为什么当我使用它时,“CGPointMake(_loginTextLabel.bounds.origin.x,_loginTextLabel.bounds.origin.y)”会生成一个(0,0)值?这是不对的。这也是一个自动布局问题? – Vimzy

+0

我猜首先我会问,你为什么认为它错了? bounds属性定义了UIView相对于框架的可绘制区域。它通常默认为(0,0,宽度,高度)。从Apple文档中获得“边界矩形的大小与帧矩形的大小相关联,以便更改一个影响另一个。更改边界大小会相对于其中心点增大或缩小视图。”你可以在这里阅读bounds属性:https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIView_Class/#//apple_ref/occ/instp/UIView/bounds –

回答

1

其实你可以布局- (void)viewDidLayoutSubviews您_loginTextLabel(或- (void)layoutSubviews如果它在你的自定义视图),而自动版式,然后像你没有任何打扰以前那样能够绘制你的看法。

如果布局使用自动布局从笔尖,那么作为阿布舍克说,你可以创建约束的网点您的看法,基本上是这样的:

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

或者如果编程创建您的约束,如苹果建议:https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/AutolayoutPG/AutolayoutPG.pdf

它基本上就像你从笔尖一样,不同的是,你只要把你的约束条件变化的动画块

[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

你能解释我实际上应该使用这一行:“yourConstraint.constant = whateverYouWant;”它的用途是什么? – Vimzy

+0

@Vimzy假设你有一个按钮,并且你为它的超级视图创建了一个引导约束的出口,其固定值如10,如下所示:@property(weak,nonatomic)IBOutlet NSLayoutConstraint * leadingConstraint;当你水平移动你的按钮时,你可以将你的约束的值从10更改为你想要的任何其他值,所以给它一个新的值,如:self.leadingConstraint.constant = 100; – John

0

为了处理程序自动版式,您需要创建约束的IBOutlets,他们是一流的NSLayoutConstraints,以及您想要更改位置或框架的位置,您需要在视图上调用updateConstraintsIfNeeded。然后,您需要将Float值设置为插座的Constant属性。

_constraintHeight.constant = 200;

相关问题