为什么UIViewController在UINavigationBar下扩展,而UITableViewController却没有?

时间:2013-10-02 17:44:05

标签: ios objective-c layout uiview ios7

我有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

现在,我Scenario 1导航堆栈上的另一个navBar,只需使用push即可。我再次有一个自定义viewController,其中包含[self.navigationController pushViewController.....]。但是我在这个表上面还有一个UIView,再次进行调试,我给它一个tableView。这次我将标签的UILabel设置为与视图的

几乎相同
redColor

所以,按照上面的逻辑,标签应该是可见的,对吧?但这一次不是。这次标签位于origin之后。

Scenario - 2

注意,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

3 个答案:

答案 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
}