2013-10-02 36 views
54

我有UITabbarController其中UINavigationController在里面。我有一个UIView的子类,我在navController中指定为viewUIViewController。这是非常标准的东西,对吧?这就是我要做的事为什么UIViewController在UINavigationBar下扩展,而UITableViewController没有?

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

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的后面。这是可以理解的,因为我在UINavigationController的子类中设置了self.navigationBar.translucent = YES;。但我不明白的是,桌子坐在navBar的下方?它不应该也从(0, 0)开始,它落后于navBar?请参阅下面的屏幕截图Scenario 1。请注意后面navBar

Scenario 1

蓝色色调现在,我push另一viewController导航堆栈上,只需使用[self.navigationController pushViewController.....]。再次我有一个自定义UIView其中tableView。不过,我也有这个表上面的UILabel,再次调试,我给它一个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后面。

Scenario - 2

通知,后面的Navbar红色色调。

我真的想一直对齐navBar下面的子视图。我的问题是

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?

+0

您是否正在使用Xcode 5和iOS7 SDK构建? –

回答

128

默认的UITableViewController的意见iOS7自动插页,使它们不启动导航栏/状态栏的下方。这是通过Interface Builder中UITableViewController的属性检查器选项卡上的“调整滚动视图插图”设置或通过UIViewController的setAutomaticallyAdjustsScrollViewInsets:方法设置的控制器。

对于UIViewController的内容,如果您不希望其视图的内容在顶部/底部条形图下扩展,则可以使用界面构建器中的顶部条形图/底部条形图条下的延伸边线。这可以通过edgesForExtendedLayout属性访问。

+48

谢谢@Greg。设置'self.edgesForExtendedLayout = UIRectEdgeNone;'做了诀窍。 – unspokenblabber

+0

谢谢。寻址edgesForExtendedLayout完成解决了我的uitableview-as-a-subview-of-navcontroller布局问题;在过去8个月中花了数不清的时间。 – ObjectiveTC

+1

使用navigationController进行push转换时,我发现应用于导航栏的“延迟”颜色处理。是什么导致这种情况以及如何删除它? – ArdenDev

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

斯威夫特2:

self.edgesForExtendedLayout = UIRectEdge.None 

斯威夫特3:

self.edgesForExtendedLayout = [] 
+0

正确,谢谢! –

+1

最有用的答案。 – yujean

+0

设置'self.edgesForExtendedLayout = []'更改'UINavigationBar'颜色。 – Hemang

9

@的Gank的答案是正确的,但要做到这一点,最好的地方是在UINavigationControllerDelegate(如果有的话) :

func navigationController(navigationController: UINavigationController, willShowViewController viewController: UIViewController, animated: Bool) { 
    viewController.edgesForExtendedLayout = UIRectEdge.None 
} 
+2

这可以避免自定义超级视图控制器。非常酷。 – Jaybo

+0

@Jaybo谢谢,是的,你把代码放在哪里会有很大的影响。 –

相关问题