【问题标题】:UIWindow creating NSAutoresizingMaskLayoutConstraints instead of NSLayoutConstraintUIWindow 创建 NSAutoresizingMaskLayoutConstraints 而不是 NSLayoutConstraint
【发布时间】:2013-03-30 06:26:55
【问题描述】:

我创建了一个简单的 iOS 应用程序,该应用程序创建了一个 UIViewController,其中包含一个 View。 这是应用程序委托:

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.viewController = [[ViewController alloc] init];
self.window.rootViewController = self.viewController;
[self.window makeKeyAndVisible];

这是 UIViewController 中的代码:

- (void)viewDidLoad {
  [super viewDidLoad];
  self.view.translatesAutoresizingMaskIntoConstraints = NO;
}

- (void)viewDidAppear:(BOOL)animated {
  NSLog(@"breakpoint here");
}

我在“这里的断点”行放了一个断点。运行应用程序并在进入调试器后输入:

(lldb) po [[UIWindow keyWindow] _autolayoutTrace]
$0 = 0x0a056d30 
*<UIWindow:0x8078de0>
|   *<UIView:0xa053fe0>

以下是该 UIView 的水平约束:

(lldb) po [0xa053fe0 constraintsAffectingLayoutForAxis:0]
$1 = 0x0a05ba60 <__NSArrayM 0xa05ba60>(
<NSLayoutConstraint:0xa059560 H:|-(0)-[UIView:0xa053fe0](LTR)   (Names: '|':UIWindow:0x8078de0 )>,
<NSLayoutConstraint:0xa0595e0 UIView:0xa053fe0.right == UIWindow:0x8078de0.right>,
<NSAutoresizingMaskLayoutConstraint:0x8571520 h=--- v=--- H:[UIWindow:0x8078de0(768)]>
)

所以这是一个简单的问题,以便我更好地理解。如果自动布局应该是新的东西,而不是自动调整掩码,为什么 UIWindow 会强制使用 NSAutoresizingMaskLayoutConstraint?我应该使用不同的初始化程序来使 UIWindow 使用常规约束吗?也许我的 UIWindow 上的 initWithFrame 是罪魁祸首?

谢谢!

【问题讨论】:

  • 你是用故事板还是代码来制作界面?
  • 一切都在代码中

标签: objective-c xcode uikit autolayout


【解决方案1】:

默认情况下,UIWindow 和控制器的顶视图是用translatesAutoresizingMaskIntoConstraints=YES 创建的,以帮助转换。来自cocoa-dev

默认情况下,对于顶级视图,Xcode 会将 translatesAutoresizingMaskIntoConstraints 的值设置为 YES,包括那些为视图控制器加载的视图。这样做的原因也是过渡性的:现在 AppKit 视图子类通常期望子视图的 translatesAutoresizingMaskIntoConstraints 设置为 YES,并且大多数应用程序正在过渡。也许在未来的某一天,默认值会更改为 NO。

您可以禁用使用代码,但不能以 Apple 提供的方式更改此行为。您可以使用 swizzling 来完成它,但编写额外的行更文雅:

self.window.translatesAutoresizingMaskIntoConstraints = NO; // application:didFinishLaunchingWithOptions:
self.view.translatesAutoresizingMaskIntoConstraints = NO; // viewWillAppear:

【讨论】:

    【解决方案2】:

    我的理解是,如果没有足够的约束,视图和 UIWindow 将依赖自动调整大小的掩码。

    约束需要定义大小和原点。如果没有足够的约束,Auto Layout 将无法定义它们。

    WWDC 2012 上的Auto Layout by Example 应该会有所帮助。

    (您对 UIWindow 的自动调整大小蒙版有疑问吗?在我的代码中,我打开了翻译,并且只在使用自动布局的地方将其关闭,不过我只是从自动布局开始。)

    【讨论】:

    • 问题是,使用我的代码,我已经禁用了所有自动调整大小的掩码。 (除非我错过了什么?)。我的问题基本上是,通过代码,我如何做到这一点,所以没有为任何视图甚至 nswindows 创建 nsautoresize 掩码?
    • 我的理解是你需要更多的约束。足以明确定义大小(宽度和高度)和位置(x 和 y)。这有帮助吗?
    猜你喜欢
    • 1970-01-01
    • 2016-11-23
    • 1970-01-01
    • 1970-01-01
    • 2011-07-30
    • 1970-01-01
    • 2019-06-18
    • 1970-01-01
    • 2016-12-13
    相关资源
    最近更新 更多