67

UITabbarControllerUINavigationController。我有一个子类,UIView我在. 这是很标准的东西,对吧?我就是这样做的viewUIViewControllernavController

_productCategoryView = [[ProductCategoryView alloc] initWithFrame:self.view.frame];
self.view = _productCategoryView;

viewUITableView一个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

方案 1

现在,我pushviewController在导航堆栈上,只需使用[self.navigationController pushViewController.....]. 我再次有一个UIView带有 a的习惯tableViewUILabel但是我在这张表上方也有一个,为了调试,我给了它一个redColor. 这次我将标签设置origin为与视图几乎相同

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.

情景 - 2

请注意,导航栏后面的红色调。

我真的很想始终对齐导航栏下方的子视图。我的问题是

1. How is the tableView offset by 64pixels (height of nav + status bar in iOS 7) automatically, even though it's frame is same as the view's?

2. Why does that not happen in the second view?

4

3 回答 3

140

默认情况下,UITableViewController 的视图在 iOS7 中自动插入,因此它们不会从导航栏/状态栏下方开始。这是通过 Interface Builder 中 UITableViewController 的 Attributes Inspector 选项卡上的“调整滚动视图插图”设置或通过setAutomaticallyAdjustsScrollViewInsets:UIViewController 的方法设置的控制器。

对于 UIViewController 的内容,如果您不希望其视图的内容在顶部/底部栏下扩展,您可以使用 Interface Builder 中的 Extend Edges Under Top Bars/Under Bottom Bars 设置。可通过edgesForExtendedLayout酒店访问。

于 2013-10-02T18:03:01.477 回答
120

目标-C:

- (void)viewDidLoad {
    [super viewDidLoad];
    self.edgesForExtendedLayout = UIRectEdgeNone;
 }

斯威夫特 2:

self.edgesForExtendedLayout = UIRectEdge.None

斯威夫特 3+:

self.edgesForExtendedLayout = []
于 2014-12-18T07:36:12.487 回答
10

@Gank 的回答是正确的,但最好的地方是UINavigationControllerDelegate(如果你有的话):

func navigationController(navigationController: UINavigationController, willShowViewController viewController: UIViewController, animated: Bool) {
    viewController.edgesForExtendedLayout = UIRectEdge.None
}
于 2016-03-04T17:15:27.780 回答