Je sais que la présence du contrôleur more view (barre de navigation) fait baisser l'UIView de sa hauteur. Je sais aussi que cette hauteur = 44px. J'ai également découvert que cette poussée vers le bas maintient le [self.view].frame.origin.y = 0
.
Alors, comment puis-je déterminer la hauteur de cette barre de navigation, autre que de simplement la définir sur une constante?
Ou, version plus courte, comment puis-je déterminer que mon UIView s'affiche avec la barre de navigation en haut?
L'ampoule a commencé à s'allumer. Malheureusement, je n'ai pas découvert de manière uniforme de corriger le problème, comme décrit ci-dessous.
Je crois que tout mon problème est centré sur mes masques de redimensionnement automatique. Et la raison pour laquelle j'ai conclu que les mêmes symptômes existent, avec ou sans UIWebView. Et ce symptôme est que tout est pêche pour Portrait. Pour Landscape, l'UIButton le plus bas apparaît derrière la TabBar.
Par exemple, sur un UIView, j'ai, de haut en bas:
UIView - les deux ressorts sont réglés (cas par défaut) et pas d'entretoises
UIScrollView - Si je place les deux ressorts et efface tout le reste (comme l'UIView), alors l'UIButton empiète sur l'objet immédiatement au-dessus. Si je nettoie tout, alors UIButton est OK, mais le truc tout en haut se cache derrière le StatusBar.
UILabel et UIImage suivant verticalement - ensemble de jambes de force supérieur, flexible partout ailleurs
Juste pour compléter l'image pour les quelques-uns qui ont une UIWebView:
UIWebView - Struts: haut, gauche, droite Ressorts: les deux
UIButton - rien de fixe, c'est-à-dire flexible partout
Bien que mon ampoule soit faible, il semble y avoir de l'espoir.
Veuillez rester avec moi car j'avais besoin de plus d'espace que celui prévu pour une courte réponse.
Merci d'essayer de comprendre ce que je pêche vraiment ... alors voilà.
1) Chaque UIViewController (une application TabBar) a une UIImage, du texte et tout ce qui se trouve en haut. Un autre dénominateur commun est un UIButton en bas. Sur certains UIViewControllers, j'ai un UIWebView au-dessus de l'UIButton.
Donc, UIImage, texte, etc. UIWebView (sur CERTAINS) UIButton
Tout ce qui précède est entouré d'un UIScrollView.
2) Pour ceux qui ont une UIWebView, son autoresizingMask ressemble à:
—
|
—
^
|
|
| - | ← ---- → | - | | | V Le masque de l'UIButton n'a rien de défini, c'est-à-dire flexible partout
Dans mon -viewDidLoad, j'appelle mon -repositionSubViews dans lequel je fais ce qui suit:
S'il n'y a pas d'UIWebView, je ne fais rien d'autre que de centrer l'UIButton que j'ai placé avec IB.
Si j'ai un UIWebView, alors je détermine son * contenu * Hauteur et définissez son cadre pour englober tout le contenu.
UIScrollView *scrollViewInsideWebView = [[webView_ subviews] lastObject];
webViewContentHeight = scrollViewInsideWebView.contentSize.height;
[webView_ setFrame:CGRectMake(webViewOriginX, webViewOriginY,
sameWholeViewScrollerWidth, webViewContentHeight)]
Une fois que je fais cela, je pousse par programme l'UIButton vers le bas afin qu'il se retrouve placé sous UIWebView.
Tout fonctionne, jusqu'à ce que je le fasse pivoter de Portrait en Paysage.
J'appelle mon -repositionSubViews dans mon -didRotateFromInterfaceOrientation.
Pourquoi la hauteur du contenu de mon UIWebView ne change-t-elle pas avec la rotation?.
De Portrait à Paysage, la largeur du contenu doit s'étendre et la hauteur du contenu doit être réduite. Il fait visuellement comme il se doit, mais pas selon mon NSLog.
Quoi qu'il en soit, avec ou sans UIWebView, le bouton dont j'ai parlé se déplace sous la TabBar en mode Paysage mais il ne défilera pas pour être vu. Je le vois derrière le TabBar quand je fais défiler "vigoureusement", mais ensuite il "retombe" derrière le TabBar.
En bout de ligne, c'est la raison pour laquelle j'ai posé des questions sur la hauteur de la TabBar et de la NavigationBar car la TabBar se plante au bas de l'UIView et la NavigationBar pousse l'UIView vers le bas.
Maintenant, je vais ajouter un commentaire ou deux ici parce qu'ils n'auraient pas eu de sens plus tôt.
Sans UIWebView, je laisse tout tel quel comme le voit IB.
Avec un UIWebView, j'augmente le frame.height de l'UIWebView à son contentHeight et ajuste également vers le haut la hauteur de l'UIScrollView environnant qui entoure toutes les sous-vues.
Bien, tu l'as maintenant.
Avec l'iPhone-X, la hauteur de la barre supérieure (barre de navigation + barre d'état) est modifiée (augmentée).
Essayez ceci si vous voulez la hauteur exacte de la barre supérieure (barre de navigation + barre d'état):
METTRE À JOUR
iOS 13
Comme le
statusBarFrame
était obsolète dans,iOS13
vous pouvez utiliser ceci:Objectif c
Swift 4
Pour plus de facilité, essayez cette extension UIViewController
Swift 3
la source
Version Swift :
la source
Avez-vous essayé cela?
la source
Prise en charge d'iOS 13 et inférieur:
la source
Donc tout ce dont nous avons réellement besoin est
la source
Mon application a quelques vues qui nécessitaient une barre de navigation personnalisée dans l'interface utilisateur pour l'apparence, mais sans contrôleur de navigation. Et l'application doit prendre en charge la version iOS antérieure à iOS 11, de sorte que le guide pratique de disposition de la zone de sécurité ne peut pas être utilisé, et je dois ajuster la position et la hauteur de la barre de navigation par programme.
J'ai attaché la barre de navigation directement à sa vue supervisée, en ignorant le guide de disposition de la zone de sécurité comme mentionné ci-dessus. Et la hauteur de la barre d'état peut être récupérée facilement depuis UIApplication, mais la hauteur de la barre de navigation par défaut est vraiment pénible ...
Cela m'a frappé pendant près d'une demi-nuit, avec un certain nombre de recherches et de tests, jusqu'à ce que je reçoive finalement l'indice d'un autre message (qui ne fonctionne pas pour moi cependant), que vous pourriez réellement obtenir la hauteur de UIView.sizeThatFits (), comme ça :
Enfin, une barre de navigation parfaite qui ressemble exactement à celle intégrée!
la source
Si vous ne voulez obtenir que la
navigationBar
hauteur, c'est simple:Cependant, si vous avez besoin de la hauteur de premier ordre de l'iPhone, vous n'avez pas besoin d'obtenir la
navigationBar
hauteur et de lui ajouter lastatusBar
hauteur, vous pouvez simplement appelersafeAreaInsets
c'est pourquoi exister.la source
L'ampoule a commencé à s'allumer. Malheureusement, je n'ai pas découvert de manière uniforme de corriger le problème, comme décrit ci-dessous.
Je crois que tout mon problème est centré sur mes masques de redimensionnement automatique. Et la raison pour laquelle j'ai conclu que les mêmes symptômes existent, avec ou sans UIWebView. Et ce symptôme est que tout est pêche pour Portrait. Pour Landscape, l'UIButton le plus bas apparaît derrière la TabBar.
Par exemple, sur un UIView, j'ai, de haut en bas:
UIView - les deux ressorts sont réglés (cas par défaut) et aucune entretoise
UIScrollView - Si je place les deux ressorts et efface tout le reste (comme l'UIView), alors l'UIButton empiète sur l'objet immédiatement au-dessus. Si je nettoie tout, alors UIButton est OK, mais le truc tout en haut se cache derrière le StatusBar.
UILabel et UIImage suivant verticalement - ensemble de jambes de force supérieur, flexible partout ailleurs
Juste pour compléter l'image pour les quelques-uns qui ont une UIWebView:
UIWebView - Struts: haut, gauche, droite Ressorts: les deux
UIButton - rien de fixe, c'est-à-dire flexible partout
Bien que mon ampoule soit faible, il semble y avoir de l'espoir.
la source
Voici le début de ma réponse à votre mise à jour:
Serait-ce parce que votre redimensionnement automatique n'a pas le masque de redimensionnement automatique pour toutes les directions?
Une autre suggestion avant de revenir pour cela, pourriez-vous utiliser une barre d'outils pour vos besoins. C'est un peu plus simple, sera toujours en bas, tourne / positionne automatiquement. Vous pouvez le cacher / l'afficher à volonté, etc. Un peu comme ça: http://cdn.artoftheiphone.com/wp-content/uploads/2009/01/yellow-pages-iphone-app-2.jpg
Vous avez peut-être envisagé cette option, mais vous l'avez simplement lancée.
Une autre idée, pourriez-vous détecter l'orientation à partir de laquelle vous effectuez une rotation et placer simplement le bouton par programme pour ajuster la barre d'onglets. (Ceci est possible avec le code)
la source
J'ai utilisé:
Fonctionne très bien si vous souhaitez obtenir la hauteur de la barre de navigation ET son origine Y.
la source
Swift 5
Si vous souhaitez également envisager le safeArea:
la source
Extension Handy Swift 4, au cas où cela serait utile à quelqu'un d'autre. Fonctionne même si le contrôleur de vue actuel n'affiche pas de barre de navigation.
Usage:
la source