我不知道为什么我的编程创建约束是模糊的,我甚至尝试从具有相同约束的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;
}
在调试时你找不到问题真的很有趣。
感谢Yun CHEN的帮助,他告诉了我很多,但真正的问题在于。
以编程方式创建的视图与Interface Builder之间存在一些不同之处。
@property(nonatomic) BOOL translatesAutoresizingMaskIntoConstraints;
//the property of UIView
我们来看看描述:
默认情况下,对于以编程方式创建的任何视图,该属性都设置为YES。如果在Interface Builder中添加视图,系统会自动将此属性设置为NO。
所以就是这样,只需将这个隐藏的boss设置为NO。一切正常。
是的,计算宽度是不明确的。它不能通过Leading
和CenterX
约束来计算。 (高度由顶部和底部约束很好地计算)。所以:
情况1,如果视图的宽度等于其超视图,则应删除CenterX
约束,并添加Trailing
约束。
情况2,如果视图的宽度是某个值并且视图居中,则应删除Leading
约束,并添加Width
约束。
情况3,如果视图的宽度是某个值并且视图左对齐,则应删除CenterX
约束,并添加Width
约束。