模糊自动布局约束(以编程方式添加)

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】:

是的,计算宽度有歧义。不能通过LeadingCenterX 约束来计算。 (高度由顶部和底部约束很好地计算)。所以:

情况1,如果视图的宽度等于其父视图的,则应删除CenterX约束,并添加Trailing约束。

情况2,如果视图的宽度为一定值,且视图居中,则应去掉Leading约束,并添加Width约束。

情况3,如果视图的宽度为一定值,并且视图左对齐,则应去掉CenterX约束,并添加Width约束。

【讨论】:

为什么计算宽度有歧义,我认为CenterX和Leading的组合在Nib文件中效果很好,请您详细说明一下:> 那么预期的宽度是多少? 恩,我试了两种情况,Xcode仍然告诉我结果不明确。 它应该和superView共享相同的宽度。 所以使用案例 1 解决方案。为什么?试想一下,Xcode 怎么知道视图的右侧在哪里?

以上是关于模糊自动布局约束(以编程方式添加)的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式向导航控制器添加自动布局约束

ObjC,在以编程方式添加/删除后恢复为界面构建器自动布局约束?

以编程方式使用自动布局添加许多按钮以查看 X、Y、填充约束

以编程方式添加控制器视图时自定义自动布局约束被破坏

以编程方式为不同大小类创建具有不同常量的自动布局约束

以编程方式将自动布局约束添加到恒定宽度和高度的子视图