我有UITabbarController
UINavigationController
。我有一个UIView
的子类,我在view
中指定为UIViewController
的{{1}}。这是非常标准的东西,对吗?我就是这样做的
navController
此_productCategoryView = [[ProductCategoryView alloc] initWithFrame:self.view.frame];
self.view = _productCategoryView;
的{{1}}为view
UITableView
为了调试,我在视图上设置subView
。
从_productCategoryTableView = [[UITableView alloc] initWithFrame:self.frame style:UITableViewStylePlain];
_productCategoryTableView.separatorStyle = UITableViewCellSeparatorStyleNone;
_productCategoryTableView.backgroundColor = [UIColor clearColor];
[self addSubview:_productCategoryTableView];
的上述初始化可能会认为视图和表的self.backgroundColor = [UIColor blueColor]
是相同的。但是,当我在tableView
中运行时,视图的原点设置在frame
后面。这是可以理解的,因为我在iOS 7
的子类中设置了UINavigationBar
。但我不明白的是桌子是如何坐在self.navigationBar.translucent = YES;
下面的?它不应该从UINavigationController
后面的navBar
开始吗?请参阅下面的屏幕截图(0, 0)
。注意navBar
现在,我Scenario 1
导航堆栈上的另一个navBar
,只需使用push
即可。我再次有一个自定义viewController
,其中包含[self.navigationController pushViewController.....]
。但是我在这个表上面还有一个UIView
,再次进行调试,我给它一个tableView
。这次我将标签的UILabel
设置为与视图的
redColor
所以,按照上面的逻辑,标签应该是可见的,对吧?但这一次不是。这次标签位于origin
之后。
注意,navBar后面的红色色调。
我真的想要一致地将navView下面的子视图对齐。我的问题是
CGRect boundsInset = UIEdgeInsetsInsetRect(self.bounds, UIEdgeInsetsMake(10, 10, 10, 10));
CGSize textSize = [_titleLabel.text sizeWithFont:_titleLabel.font
constrainedToSize:CGSizeMake(boundsInset.size.width, MAXFLOAT)
lineBreakMode:NSLineBreakByWordWrapping];
printSize(textSize);
_titleLabel.frame = CGRectMake(boundsInset.origin.x,
boundsInset.origin.y,
boundsInset.size.width,
textSize.height);
navBar
答案 0 :(得分:135)
默认情况下,UITableViewController的视图会自动插入iOS7中,以便它们不会从导航栏/状态栏下方开始。这是通过Interface Builder中UITableViewController的Attributes Inspector选项卡上的“Adjust scroll view insets”设置控制的,或者是UIViewController的setAutomaticallyAdjustsScrollViewInsets:
方法。
对于UIViewController的内容,如果您不希望其视图的内容在顶部/底部栏下方扩展,则可以使用Interface Builder中的“在顶栏下/底部栏下设置延伸边”设置。这可以通过edgesForExtendedLayout
属性访问。
答案 1 :(得分:109)
- (void)viewDidLoad {
[super viewDidLoad];
self.edgesForExtendedLayout = UIRectEdgeNone;
}
斯威夫特2:
self.edgesForExtendedLayout = UIRectEdge.None
斯威夫特3:
self.edgesForExtendedLayout = []
答案 2 :(得分:9)
@ Gank的答案是正确的,但最好的地方是UINavigationControllerDelegate
(如果你有的话):
func navigationController(navigationController: UINavigationController, willShowViewController viewController: UIViewController, animated: Bool) {
viewController.edgesForExtendedLayout = UIRectEdge.None
}