【发布时间】:2013-12-02 14:52:07
【问题描述】:
我正在开发一个使用自动布局的应用程序。我正在执行以下步骤:
-
第一步:在
viewDidLoad中创建一个按钮[super viewDidLoad]; self.view.translatesAutoresizingMaskIntoConstraints = NO; _button1 = [UIButton buttonWithType:UIButtonTypeRoundedRect]; _button1.translatesAutoresizingMaskIntoConstraints = NO; [_button1 setTitle:@"B" forState:UIControlStateNormal]; [self.view addSubview:_button1]; -
第 2 步:在
updateViewConstraints方法中实现约束[super updateViewConstraints]; [self.view removeConstraints:self.view.constraints]; if (UIInterfaceOrientationIsPortrait([UIApplication sharedApplication].statusBarOrientation)) { NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:_button1 attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeLeft multiplier:1.0f constant:100.0f]; [self.view addConstraint:constraint]; NSLayoutConstraint *constraint1 = [NSLayoutConstraint constraintWithItem:_button1 attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeRight multiplier:1.0f constant:-100.0f]; [self.view addConstraint:constraint1]; NSLayoutConstraint *constraint2 = [NSLayoutConstraint constraintWithItem:_button1 attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeTop multiplier:1.0f constant:200.0f]; [self.view addConstraint:constraint2]; NSLayoutConstraint *constraint3 = [NSLayoutConstraint constraintWithItem:_button1 attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeBottom multiplier:1.0f constant:-100.0f]; [self.view addConstraint:constraint3]; _button1.backgroundColor = [UIColor redColor]; } else{ NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:_button1 attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeLeft multiplier:1.0f constant:200.0f]; [self.view addConstraint:constraint]; NSLayoutConstraint *constraint1 = [NSLayoutConstraint constraintWithItem:_button1 attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeRight multiplier:1.0f constant:-200]; [self.view addConstraint:constraint1]; NSLayoutConstraint *constraint2 = [NSLayoutConstraint constraintWithItem:_button1 attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeTop multiplier:1.0f constant:50.0f]; [self.view addConstraint:constraint2]; NSLayoutConstraint *constraint3 = [NSLayoutConstraint constraintWithItem:_button1 attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeBottom multiplier:1.0f constant:-50.0f]; [self.view addConstraint:constraint3]; _button1.backgroundColor = [UIColor blueColor]; }
但是当我切换设备方向时,控制台会打印以下内容:
无法同时满足约束。可能至少有一个 以下列表中的约束是您不想要的。尝试 这个:(1)查看每个约束并尝试找出你 不要期待; (2) 找到添加了不需要的约束的代码或 约束并修复它。 (注:如果你看到 NSAutoresizingMaskLayoutConstraints 你不明白的,参考 到 UIView 属性的文档 translatesAutoresizingMaskIntoConstraints) ( "UIView:0x8a461c0 (名称: '|':UIWindow:0x8a42970 )>", "", "", "UIButton:0x8a45ea0 (名称: '|':UIView:0x8a461c0 )>", "")
将尝试通过打破约束来恢复
中断 objc_exception_throw 以在调试器中捕获它。这 UIView 上的 UIConstraintBasedLayoutDebugging 类别中的方法 中列出的也可能有帮助。
谁能告诉我这个布局有什么问题?
【问题讨论】:
-
我将您的代码复制到一个新项目中并放入一个 ViewController 中,它工作得很好。所以也许你自己尝试一下,也许你在项目中遗漏了一些东西?
-
@matths 这个问题会在 iPhone 设备/模拟器上表现出来,并且只有当你从横向旋转回纵向时才会出现。
标签: ios iphone objective-c autolayout autorotate