不明确的自动布局约束(以编程方式添加)

时间:2017-12-14 01:45:23

标签: ios iphone autolayout

我不知道为什么我的编程创建约束是不明确的,我甚至尝试从具有相同约束的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

2 个答案:

答案 0 :(得分:1)

感谢Yun CHEN的帮助,他告诉了我很多,但真正的问题是。

以编程方式创建的视图与Interface Builder之间存在一些不同之处。

@property(nonatomic) BOOL translatesAutoresizingMaskIntoConstraints;
//the property of UIView

Iet读了解说:

默认情况下,对于以编程方式创建的任何视图,属性设置为YES 。如果在Interface Builder中添加视图,系统会自动将此属性设置为NO。

这就是说,只需将这个隐藏的boss设置为NO即可。一切正常。

答案 1 :(得分:0)

是的,计算宽度时不明确。无法通过LeadingCenterX约束来计算。 (高度由顶部和底部约束很好地计算)。所以:

案例1,如果视图的宽度等于其超级视图,则应删除CenterX约束,并添加Trailing约束。

案例2,如果视图的宽度是特定值并且视图居中,则应删除Leading约束,并添加Width约束。

案例3,如果视图的宽度是特定值且视图左对齐,则应删除CenterX约束,并添加{{1}约束。