8
votes

iOS 7 uitoolbar remplacement de barre d'état

J'ai mis à niveau mon projet de iOS 6 à iOS 7, mais il semble un peu de problème. La barre d'état et une barre d'outils sont primordiales et très proches les unes des autres. La barre d'outils a été ajoutée plus tôt en le faisant glisser manuellement dans le storyboard. C'est comme ça que c'est montrant:

barre d'outils

J'ai vu quelques questions Cela suggère d'utiliser "Positionnement de la barre:" et "- (uibarposition) positionForbar: (ID) bar" mais je ne sais pas exactement comment les utiliser, une petite explication et un moyen facile de le faire pourrait aider. Merci!

MISE À JOUR: Voici un code qui nécessite également un correctif. Cela fonctionnait bien plus tôt, mais puisque la DétailViewController (WebViewController) est maintenant intégrée à l'intérieur d'un contrôleur de navigation, le code ci-dessous provoque une exception. On dirait que je dois modifier la première ligne dans cette méthode. xxx


0 commentaires

6 Réponses :


6
votes
_toolBar.delegate = self;

- (UIBarPosition)positionForBar:(id <UIBarPositioning>)bar {
    CGRect frame = _toolBar.frame;
    frame.origin = CGPointMake(0, [UIApplication sharedApplication].statusBarFrame.size.height);
    _toolBar.frame = frame;

    return UIBarPositionTopAttached;
}
portrait barlandscape bar

5 commentaires

Et si la vue est dans le conteneur dans une vue super. Que faire alors?


Votre barre d'outils est à l'intérieur du conteneur?


La barre d'outils est dans la vue, mais cette vue est à l'intérieur du conteneur? J'ai utilisé le code dans votre réponse, mais cela n'a pas fonctionné. Avez-vous une idée de ce que je devrais changer d'autre pour que cela fonctionne?


Peut-être que l'origine de votre conteneur est négative? Essayez de déplacer votre vue de conteneur. Et vérifiez le masque automobilitaire de votre boîte d'outils. Il devrait être uiviewaToresizingflexibletopmargin.


Et utilisez UIViewAnutoresizedFlexibleWidth Si vous avez besoin d'orientations de portrait et de paysage dans votre application.



2
votes

Si votre configuration est une vue divisée comme la configuration avec deux vues de conteneur, vous devriez pouvoir le faire. Lorsque vous configurez les vues du conteneur, faites glisser le haut jusqu'à ce que vous voyiez la ligne bleue en pointillé indiquant que le haut est au bas de la barre d'état. Faites cela avec des vues de conteneurs. Ajoutez la barre d'outils au contrôleur incorporé (pas la vue du conteneur), épinglé vers le haut de la vue de ce contrôleur. Avec la vue de gauche étant intégrée dans un contrôleur de navigation, mon écran ressemblait à ceci:

Entrez la description de l'image ici


8 commentaires

Puis-je utiliser la barre de navigation dans le conteneur de vue détaillée au lieu d'une barre d'outils. Comme vous connaissez la couleur que nous donnons à la barre de navigation est appliquée à la barre d'état ainsi qu'à IOS 7 et c'est ce que j'essaie d'atteindre.


@ AJ112, bien sûr. Vous pouvez intégrer ce contrôleur dans un contrôleur de navigation ou simplement glisser dans une barre de navigation.


Oui, je peux utiliser une barre NAV ou intégrer le détaillantView dans un contrôleur de navigation. Avec la barre d'outils, cela fonctionnait bien, j'ai remplacé la barre d'outils avec une barre de navigation glissée dans le DétailView. Cela fonctionne mais il collecte avec la barre d'état comme la barre d'outils. Si je déplace la barre de navigation en détailView 20 points ci-dessous, je ne peux toujours pas modifier la couleur de la barre d'état en modifiant la couleur de la barre de navigation. Il s'avère que la barre de navigation glissée manuellement ne change pas la couleur de la barre d'état avec elle.


La deuxième option consiste à intégrer le détaillantView dans le contrôleur de navigation. J'ai essayé de faire ça et c'est la bonne chose à faire si je veux la barre d'état et la couleur NavBar de la même manière pour iOS 7. Mais cela jette une exception. Voici le lien vers un exemple de projet avec une barre de navigation ajoutée à celle-ci jmp.sh/v/cutcph6ekzqgotoerslo


@ AJ112, je ne suis pas sûr que dans quelles circonstances vous obtenez une exception, mais c'est probablement parce que vous devez modifier la manière dont vous définissez la définition de Self.SplitViewController dans le contrôleur de détail. Au lieu de Self.Splitlikecontroller = (RDSplitlikecontroller *) Self.ParentViewController Vous devez avoir Self.splitlikecontroller = (RDSplitlikecontroller *) Self.navigationController.ParentViewController. Lorsque j'ai intégré le contrôleur de détail dans un contrôleur de navigation, j'ai modifié ce que j'ai dit ci-dessus et ajouté le bouton de la barre, tout a bien fonctionné.


Ça a marché. Il me manquait cette petite modification que vous avez mentionnée. Merci beaucoup pour l'aide. J'ai marqué votre réponse comme le correct. Cependant, il y a un petit problème que j'ai ajouté dans la question comme une mise à jour, jetez un coup d'œil. Merci


@ AJ112, où vous avez, webviewController * wvc = ... changez que vers uinavigationController * nav == ..., puis ajoutez une autre ligne WebViewController * WVC = NAV.TOPVIEWCONTROLLER;


Hey Mind Regardez dans cette question Stackoverflow. com / questions / 19507639 / ...



3
votes

N'oubliez pas que vous ne devriez pas simplement déplacer les choses dans IB pour deux raisons:

  1. non compatible avec iOS 6 li>
  2. ne prolongera pas l'effet de fond de la barre supérieure sous la barre d'état LI> ol>

    Quoi de ne pas faire ... p>

    donc, si Vous souhaitez compatibilité IOS6 & iOS7, vous pouvez ajouter un conditionnel pour des objets nécessitant une personnalisation dans ViewDidLoad code>. Companier étant ceci est un scénario de dernier cas - essayez toujours de la remédier avec Autolayout / IB d'abord: P>

    topBar.delegate = self;
    
    - (UIBarPosition)positionForBar:(id <UIBarPositioning>)bar {
    
        return UIBarPositionTopAttached;
    }
    


1 commentaires

Bien entendu, toute la première partie pourrait être résolue en définissant simplement l'utilisation du drapeau «Utilisez-vous)» (AKA WESTFULSREN) dans IB.



4
votes

La principale contrainte de votre vue ne doit plus être supérieure à SuperView, mais plutôt guide de mise en page supérieur de haut niveau supérieur.

Vous pouvez le faire en déplaçant l'espace supérieur situé sous la barre d'état, puis en utilisant le menu de contrainte pour ajouter la contrainte au voisin le plus proche, qui devrait maintenant être le guide de la disposition supérieure, ou vous pouvez le faire comme décrit dans < a href = "https://developer.apple.com/library/ios/qa/qa1797/_index.html" rel = "nofollow"> Ce lien sur la bibliothèque de développeurs d'Apple .


1 commentaires

Ce lien m'a été vraiment utile. Une chose que j'ai dû lutter avec que Xcode a continué de vouloir créer la nouvelle contrainte d'espacement verticale en associant le bas de l'uitoolbar avec le guide de mise en page supérieur, nécessitant des valeurs négatives pour que les choses se ressemblent. Pour tromper Xcode dans l'association du haut de l'UIToolbar avec le guide de mise en page supérieur, j'ai d'abord dû déplacer le haut de la tête en dessous du guide, puis créer la contrainte. Après cela, je fixe la valeur de contrainte à zéro, qui boulonnait les deux ensemble.



1
votes

J'essayais de faire à peu près la même chose, mais je n'ai pas aimé la barre d'état blanc de la réponse acceptée. J'ai réussi à faire placer la barre d'outils sous la barre d'état de sorte qu'elle ait une couleur cohérente à la barre de navigation qui se trouve à côté de celui-ci dans la vue Master.

Ma solution consistait à faire de la barre d'outils 64 points de hauteur et à régler le Topspace sur le SuperView à 0.

Lorsque vous devez vous assurer que vous ne créez pas la contrainte au guide de mise en page supérieur. J'ai pu obtenir cela dans le constructeur d'interface en réglant le cadre à 0,0 avec une hauteur de 64. Puis j'ai utilisé la boîte de dialogue PIN du menu d'outil flottant. J'ai utilisé zéro avec le top i faisceau pour créer la contrainte.

Les bords inférieurs correspondent au maître et au détail et la coloration est cohérente. Les commandes de ma barre d'outils ont fini par sucrédé.


2 commentaires

Merci ... L'ajout de 20 à la hauteur de la barre d'outils était la seule solution que j'ai trouvée qui n'avait pas besoin d'autolayout, qui nécessite iOS 6. J'ai beaucoup d'utilisateurs iPad 1, donc je souhaite maintenir le support pour iOS 5 dans mon app.


En fait, lorsque j'ai augmenté la hauteur de la barre d'outils, j'ai constaté que le titre de la barre d'outils (UIBARITEM) resta moins aligné mais des boutons de barre d'outils (UIBARBUTTNITEM) étaient centrés verticalement - leur position était trop élevée. La seule façon de trouver pour ajuster la position était de configurer le bouton de la barre d'outils en tant qu'alibutton défini comme personnifieview de l'Uibarbuttonitem, puis ajustez le cadre de l'UIBTTON. Si vous devez appliquer la barre d'outils TintColor dans l'icône du bouton, vous devez utiliser un UIImageView au lieu d'un Uibutton.



-1
votes

Swift 3

Connectez votre barreau de barre et conforme à UIToolBardélégate. Ajoutez ensuite cette méthode de déléguée: xxx

car maintenant xxx


0 commentaires