Por que o UIViewController se estende sob o UINavigationBar, enquanto o UITableViewController não?
eu tenhoUITabbarController
comUINavigationController
nisso. Eu tenho uma subclasse deUIView
que eu atribuo como oview
doUIViewController
nonavController
. Isso é bastante normal, certo? É assim que eu faço
_productCategoryView = [[ProductCategoryView alloc] initWithFrame:self.view.frame];
self.view = _productCategoryView;
esteview
tem umUITableView
ComosubView
_productCategoryTableView = [[UITableView alloc] initWithFrame:self.frame style:UITableViewStylePlain];
_productCategoryTableView.separatorStyle = UITableViewCellSeparatorStyleNone;
_productCategoryTableView.backgroundColor = [UIColor clearColor];
[self addSubview:_productCategoryTableView];
Por uma questão de depuração eu estou definindoself.backgroundColor = [UIColor blueColor]
na vista.
Da inicialização acima detableView
pode-se pensar que a visão e a mesaframe
é igual. No entanto, quando eu corro emiOS 7
, a origem da visão é definida atrás doUINavigationBar
. Isso é compreensível porque estou definindoself.navigationBar.translucent = YES;
na minha subclasse deUINavigationController
. Mas o que eu não entendo é como é que a mesa está sentada logo abaixo donavBar
? Não deveria também começar de(0, 0)
que está por trás donavBar
? Ver captura de telaScenario 1
abaixo. Observe a tonalidade azul por trásnavBar
Agora eupush
outroviewController
na pilha de navegação, simplesmente usando[self.navigationController pushViewController.....]
. Mais uma vez eu tenho um costumeUIView
com umtableView
nisso. No entanto, eu também tenho umUILabel
acima desta tabela, e novamente para depuração, eu dei-lhe umredColor
. Desta vez eu estou definindo o rótuloorigin
ser quase o mesmo que o da vista
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);
Então, seguindo a lógica acima, o rótulo deve estar visível, certo? Mas desta vez não é. Desta vez, o rótulo está por trás donavBar
.
Observe, a tonalidade vermelha por trás do navBar.
Eu realmente gostaria de alinhar o subView abaixo do navBar de forma consistente. Minhas perguntas são
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?