自动布局打开时如何以编程方式更改 UIView 的位置

Posted

技术标签:

【中文标题】自动布局打开时如何以编程方式更改 UIView 的位置【英文标题】:How to Programatically Change Position of UIViews When Autolayout is On 【发布时间】:2015-09-07 01:31:08 【问题描述】:

我已经被这个问题困扰了很长一段时间了。在 Objective-C 中开发 ios 应用程序时,我们如何在启用 Autolayout 的情况下以编程方式更改 UIViews 的位置(位置)?没有 Autolayout 就这么简单,因为我们只需为 UIView 指定一个新中心:

UIView.center = CGPointMake(x,y);

但是,由于自动布局,上述方法不再有效。最终,我试图通过使用从左到右的翻译转换来为某个 UIView 设置动画。不过,为了做到这一点,我需要以编程方式移动 UIView,这是我目前无法做到的。下面是我试图做的事情(但由于自动布局它不起作用):

_loginTextLabel.center = CGPointMake(1,1);

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

 completion:nil
 ];

【问题讨论】:

这篇文章中有几个有趣的想法:***.com/questions/11368440/… 一个简单的起点,在设置新中心之前尝试设置translatesAutoresizingMaskIntoConstraints = YES @WilliamSmith 还有一个问题。为什么“CGPointMake(_loginTextLabel.bounds.origin.x,_loginTextLabel.bounds.origin.y)”在我使用时会产生(0,0)值?这是错的。这也是自动布局的问题吗? 我想首先我会问,你为什么认为它错了? bounds 属性定义了 UIView 相对于框架的可绘制区域。它通常默认为 (0, 0, width, height)。来自Apple docs“边界矩形的大小与框架矩形的大小相关,因此对一个矩形的更改会影响另一个。更改边界大小会相对于其中心点增大或缩小视图。”您可以在此处阅读 bounds 属性:developer.apple.com/library/ios/documentation/UIKit/Reference/… 【参考方案1】:

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

如果您使用来自 Nib 的自动布局来布局视图,那么您可以按照 Abhishek 的说法创建约束的出口,基本上是这样的:

[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

这基本上就像你从 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
];

【讨论】:

你能解释一下我实际上应该如何使用这一行:“yourConstraint.constant = 不管你想要;”它是干什么用的? @Vimzy 假设你有一个按钮,并且你创建了它的前导约束到它的超级视图的出口,具有像 10 这样的固定值,像这样:@property (weak, nonatomic) IBOutlet NSLayoutConstraint *领先的约束;当您水平移动按钮时,您可以将约束的值从 10 更改为您想要的任何其他值,因此只需给它一个新值,例如:self.leadingConstraint.constant = 100;【参考方案2】:

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

_constraintHeight.constant = 200;

【讨论】:

以上是关于自动布局打开时如何以编程方式更改 UIView 的位置的主要内容,如果未能解决你的问题,请参考以下文章

程序化自动布局更改 UIView 的行为

如何使用自动布局在 ios 中以编程方式在 UIview 上添加 UIbutton

使用自动布局约束以编程方式创建四个具有相同高度和宽度的 UIView

iOS 以编程方式更改 uiview 布局

iOS - 以编程方式使用自动布局将 UIView 定位在超级视图的中心

UIScrollView 不使用自动布局滚动(内容视图框架大小以编程方式更改)