模糊自动布局约束(以编程方式添加)
Posted
技术标签:
【中文标题】模糊自动布局约束(以编程方式添加)【英文标题】:Ambiguous Auto Layout Constraints (Programmatically added) 【发布时间】:2017-12-14 01:45:22 【问题描述】:我不知道为什么我以编程方式创建的约束是模棱两可的,我什至尝试从具有相同约束的 Nib 初始化,它可以工作,但为什么我的代码不是。
@interface rootViewController: UIViewController
@end
@implementation rootViewController
- (void)loadView
self.view = [[UIView alloc] init];
UIView *theView = [[UIView alloc] init];
[self.view addSubview:theView];
NSArray *arr = @[
[theView.topAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.topAnchor],
[theView.bottomAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.bottomAnchor],
[theView.centerXAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.centerXAnchor],
[theView.leadingAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.leadingAnchor]];
[NSLayoutConstraint activateConstraints:arr];
@end
//And I load it in the ApplicationDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
// Override point for customization after application launch.
self.window = [[UIWindow alloc] init];
self.window.rootViewController = [[rootViewController alloc] init];
[self.window makeKeyAndVisible];
return YES;
调试时找不到问题真的很有趣。
The debug output
【问题讨论】:
【参考方案1】:感谢Yun CHEN的帮助,他告诉了我很多,但真正的问题是。
以编程方式创建的视图与通过 Interface Builder 创建的视图之间存在一些不同。
@property(nonatomic) BOOL translatesAutoresizingMaskIntoConstraints;
//the property of UIView
请看说明:
默认情况下,对于您以编程方式创建的任何视图,该属性都设置为 YES。如果在 Interface Builder 中添加视图,系统会自动将此属性设置为 NO。
也就是说,只要把这个隐藏的boss设置为NO。一切正常。
【讨论】:
【参考方案2】:是的,计算宽度有歧义。不能通过Leading
和CenterX
约束来计算。 (高度由顶部和底部约束很好地计算)。所以:
情况1,如果视图的宽度等于其父视图的,则应删除CenterX
约束,并添加Trailing
约束。
情况2,如果视图的宽度为一定值,且视图居中,则应去掉Leading
约束,并添加Width
约束。
情况3,如果视图的宽度为一定值,并且视图左对齐,则应去掉CenterX
约束,并添加Width
约束。
【讨论】:
为什么计算宽度有歧义,我认为CenterX和Leading的组合在Nib文件中效果很好,请您详细说明一下:> 那么预期的宽度是多少? 恩,我试了两种情况,Xcode仍然告诉我结果不明确。 它应该和superView共享相同的宽度。 所以使用案例 1 解决方案。为什么?试想一下,Xcode 怎么知道视图的右侧在哪里?以上是关于模糊自动布局约束(以编程方式添加)的主要内容,如果未能解决你的问题,请参考以下文章