【问题标题】:translatesAutoresizingMaskIntoConstraints doesn't worktranslatesAutoresizingMaskIntoConstraints 不起作用
【发布时间】:2014-08-15 15:16:26
【问题描述】:

我以编程方式创建了一个 UIButton 并将其添加到这样的视图中:

self.button = [[UIButton alloc] initWithFrame:CGRectMake(20, 20, 100, 30)];
[self.button setTitle:@"Test" forState:UIControlStateNormal];
self.button.translatesAutoresizingMaskIntoConstraints = YES;
[myView addSubview:self.button];

按钮显示正确,并且不使用其固有大小(这是正确的,因为 translatesAutoresizingMaskIntoConstraints 已打开)。但是,当我打印出 myView.constraints 时,我看不到有关按钮的任何约束。根据定义,当 translatesAutoresizingMaskIntoConstraints 打开时,将自动生成约束并添加到超级视图,在本例中为 myView。

那么为什么这里没有生成约束呢?为什么布局系统仍然知道如何在屏幕上布局按钮?

********更新: 我想我知道原因。 当 UIView 没有附加任何约束时,布局系统将不会到位。它将使用视图的框架。 在这种情况下,当我们打开 translatesAutoresizingMaskIntoConstraints 时,不会生成按钮的内在约束,因此按钮没有任何约束。因此将使用框架。 从代码创建的所有 UIView 都将 translatesAutoresizingMaskIntoConstraints 默认为 YES,因此不会为视图自动生成约束。框架将被使用。这对于向后兼容非常有意义。

【问题讨论】:

  • 您还有哪些使用自动布局的视图?
  • 主视图从 nib 加载,它使用 AutoLayout。

标签: ios autolayout programmatically-created


【解决方案1】:

文档描述其行为如下:

如果translatesAutoresizingMaskIntoConstraints = YES,视图的父视图查看视图的自动调整掩码,生成实现它的约束,并将这些约束添加到自身(父视图)。

基于此描述,预计能够在 ‑[UIView constraints] 数组中查找已翻译的约束,但生成的约束并未添加到那里 当您以编程方式创建视图时(如果视图添加在 nib那么只有我们会得到预期的行为)。

经过调试器的一番仔细探索,我确定约束是在布局时通过私有方法‑[UIView(UIConstraintBasedLayout) _constraintsEquivalentToAutoresizingMask]按需生成的。

要查看该约束,请创建一个 UIView

类别
@interface UIView(TestConstriants)

- (NSArray *)_constraintsEquivalentToAutoresizingMask;

@end

将此类别导入您的 ViewController 类#import "UIView+TestConstriants.h"

调用这行代码经常添加 self.buttonview

NSLog(@"constraints: %@", [self.button _constraintsEquivalentToAutoresizingMask]);

上面记录了等效于 autoResize 掩码的约束。 尝试通过将 autoresizingMask 设置为不同的值进行测试,您将获得相应的等效约束。

【讨论】:

  • 实际上没有为按钮生成约束。请参阅我的第一个帖子更新以获得解释。
  • 但是如果 View 启用了自动布局,它总是会为其子视图生成约束。
  • 它没有。仅当视图已经具有约束时(通过添加到它,或者如果视图具有固有大小并且 translatesAutoresizingMaskIntoConstraints = NO),否则不会为其生成约束,忽略其父视图。这是为了向后兼容。假设您使用一个非自动布局库,该库在您的项目中有一个自定义 UIView。除非您明确要求,否则不会为该视图生成约束。
猜你喜欢
  • 1970-01-01
  • 2021-10-21
  • 1970-01-01
  • 1970-01-01
  • 2021-03-23
  • 1970-01-01
  • 2013-06-11
  • 2018-05-27
  • 2023-03-13
相关资源
最近更新 更多