自动布局打开时如何以编程方式更改 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 的位置的主要内容,如果未能解决你的问题,请参考以下文章
如何使用自动布局在 ios 中以编程方式在 UIview 上添加 UIbutton
使用自动布局约束以编程方式创建四个具有相同高度和宽度的 UIView