Pourquoi ne UIViewController étendre sous UINavigationBar, tandis que UITableViewController ne l'est pas?
J'ai UITabbarController
avec UINavigationController
en elle. J'ai une sous-classe de UIView
que j'attribue le view
de UIViewController
dans le navController
. C'est assez standard, non? C'est la façon dont je le fais
_productCategoryView = [[ProductCategoryView alloc] initWithFrame:self.view.frame];
self.view = _productCategoryView;
Ce view
a un UITableView
comme subView
_productCategoryTableView = [[UITableView alloc] initWithFrame:self.frame style:UITableViewStylePlain];
_productCategoryTableView.separatorStyle = UITableViewCellSeparatorStyleNone;
_productCategoryTableView.backgroundColor = [UIColor clearColor];
[self addSubview:_productCategoryTableView];
Pour des raisons de débogage je suis en train de self.backgroundColor = [UIColor blueColor]
sur la vue.
À partir du dessus de l'initialisation de tableView
on pourrait penser que la vue et de la table de frame
est le même. Cependant quand je lance en iOS 7
, le point de vue de l'origine est située derrière le UINavigationBar
. Cela est compréhensible parce que je suis en train de self.navigationBar.translucent = YES;
dans mon sous-classe de UINavigationController
. Mais ce que je ne comprends pas, c'est comment la table est assis juste en dessous de la navBar
? Ne devrait-elle pas également démarrer à partir de (0, 0)
qui est derrière le navBar
? Voir la capture d'écran Scenario 1
ci-dessous. Avis de la teinte bleue derrière navBar
Maintenant, je push
un autre viewController
sur la pile de navigation, en utilisant simplement [self.navigationController pushViewController.....]
. De plus, j'ai une coutume UIView
avec un tableView
en elle. Cependant, j'ai un UILabel
au-dessus de cette table, et, de nouveau, à des fins de débogage, je lui ai donné un redColor
. Cette fois, je suis en train de l'étiquette du origin
à être presque le même que le point de vue de l'
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);
Donc, en allant par la logique ci-dessus, l'étiquette doit être visible, à droite? Mais cette fois, il ne l'est pas. Cette fois, le label est derrière le navBar
.
Avis, la teinte rouge derrière la barre de navigation.
Je tiens vraiment à aligner la sous-vue en dessous de la barre de navigation de manière cohérente. Mes questions sont les
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?
- Vous construisez avec Xcode 5 et le iOS7 SDK?
Vous devez vous connecter pour publier un commentaire.
Par défaut, UITableViewController de vues sont automatiquement l'encart de l'iOS7, de sorte qu'ils ne commencent pas au-dessous de la barre de navigation et la barre de status. C'est le contrôleur par le "Ajuster le défilement de l'affichage des encarts" réglage de la sur les Attributs de l'Inspecteur de l'onglet de la UITableViewController dans Interface Builder, ou par le
setAutomaticallyAdjustsScrollViewInsets:
méthode de UIViewController.Pour un UIViewController du contenu, si vous ne voulez pas son point de vue du contenu pour étendre sous le haut/bas des barres, vous pouvez utiliser l'Étendre les Bords Sous les Barres du Haut/par le Bas des Barres de paramètres dans Interface Builder. Il est accessible via le
edgesForExtendedLayout
propriété.self.edgesForExtendedLayout = UIRectEdgeNone;
a fait le tour.self.navigationController.navigationBar.translucent = NO;
[[UINavigationBar appearance] setTranslucent:NO];
La "Étendre Sous la Barre du Haut" dans Interface Builder semble être seulement pour l'aperçu, il n'a pas d'effet sur le comportement de la vue au moment de l'exécution.Objective-C:
Swift 2:
Swift 3+:
self.edgesForExtendedLayout = []
changements de laUINavigationBar
couleur.@Gank réponse est bonne, mais le meilleur endroit pour le faire est sur le
UINavigationControllerDelegate
(si vous en avez un):