我们可以在NSLayoutConstraint
和self.navigationcontroller.navigationbar
内的视图之间添加self.view
吗? self是UIViewController
个实例,_textField
是self.view
的子视图
我需要的是,无论navigationBar
是否为半透明,UI都应该看起来相似。
我尝试了以下内容。但它不起作用。
NSLayoutConstraint* cn = [NSLayoutConstraint constraintWithItem:_textField
attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual
toItem:self.navigationController.navigationBar attribute:NSLayoutAttributeBottom
multiplier:1.0 constant:20];
[self.navigationcontroller.view addConstraint:cn];
答案 0 :(得分:6)
是的,您可以在导航栏和视图之间添加约束。添加到导航控制器的根视图控制器包含topLayoutGuide。所以像这样调整你的代码:
NSLayoutConstraint* cn = [NSLayoutConstraint constraintWithItem:_textField
attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual
toItem:self.rootViewController.topLayoutGuide attribute:NSLayoutAttributeBottom
multiplier:1.0 constant:20];
[self.rootViewController.view addConstraint:cn];
请注意,除了导航控制器的rootViewController之外,我根本没有引用导航控制器。
您也可以使用bottomLayoutGuide以同样的方式在TabBar上方。 (但是如果你需要这样做,你会在iOS框架中遇到一个带有解决方法补丁的错误:UIViews ending up beneath tab bar)
答案 1 :(得分:5)
查看UIViewController上的topLayoutGuide
媒体资源。
Apple的'UIViewController'文档中有一个例子就是这样......
topLayoutGuide
Indicates the highest vertical extent for your onscreen content, for use with Auto Layout constraints. (read-only)
@property(nonatomic, readonly, retain) id<UILayoutSupport> topLayoutGuide
然后......
作为如何以编程方式将此属性与Auto一起使用的示例 布局,假设您想要将控件放置在其上边缘 顶部布局指南下方20点。此方案适用于任何 上面列出的方案。使用类似于以下内容的代码:
[button setTranslatesAutoresizingMaskIntoConstraints: NO];
id topGuide = myViewController.topLayoutGuide;
NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings (button, topGuide);
[myViewController.view addConstraints:
[NSLayoutConstraint constraintsWithVisualFormat: @"V: [topGuide]-20-[button]"
options: 0
metrics: nil
views: viewsDictionary]
self.view layoutSubviews; // You must call this method here or the system raises an exception
];
答案 2 :(得分:3)
在textField的顶部和父视图的顶部之间添加约束。约束的常量可以设置为状态栏的高度+导航栏的高度。
显然,以下代码段仅在状态栏和导航栏都是半透明且视图控制器需要全屏布局时才有效。如有必要,您可以轻松测试透明度并进行相应调整。
如果您正在使用界面构建器,您还可以为现有约束创建IBOutlet,并将其设置为常量而不是创建新约束。
// Obtain the view rect of the status bar frame in either portrait or landscape
CGRect statusBarFrame = [[UIApplication sharedApplication] statusBarFrame];
CGRect statusBarWindowRect = [self.view.window convertRect:statusBarFrame fromWindow: nil];
CGRect statusBarViewRect = [self.view convertRect:statusBarWindowRect fromView: nil];
// Add Status Bar and Navigation Bar heights together
CGFloat height = self.navigationController.navigationBar.frame.size.height +
statusBarViewRect.size.height;
// Create & Add Constraint
NSLayoutConstraint *constraint =
[NSLayoutConstraint constraintWithItem:self.fieldLabel
attribute:NSLayoutAttributeTop
relatedBy:0
toItem:self.view
attribute:NSLayoutAttributeTop
multiplier:1
constant:height];
[self.view addConstraint:constraint];