web-dev-qa-db-fra.com

extension de l'application iOS 10 iMessage: comment calculer la hauteur de la barre de navigation très haute

J'ai téléchargé la version bêta de Xcode 8 et j'essayais de jouer avec l'extension sdk de l'application iMessages, mais j'ai rencontré un problème avec leur hauteur de barre de navigation apparemment non standard.

lorsque je passe dans la vue développée de l'application, mon image avec le cadre suivant CGRect(x: 0, y: 0, width: 100, height: 100) finit par être partiellement masquée derrière la barre de navigation. Je voudrais qu'il apparaisse sous la barre de navigation.

j'ai essayé self.navigationController?.navigationBar.isTranslucent = false mais cela n'a pas fonctionné, ce qui est logique car il est hors de portée de mon application à contrôler. 

est-ce que quelqu'un a déjà joué avec ça? Je veux éviter 2 choses. simplement deviner la hauteur appropriée et s'éloigner d'une solution programmatique.  compact  expanded Merci pour l'aide

21
stanley

Il peut être utile d’avoir une contrainte avec le guide de présentation supérieur comme ceci:

view.topAnchor.constraint(equalTo: self.topLayoutGuide.bottomAnchor).isActive = true
15
Jeremy Kelleher

Si vous êtes comme moi et que vous trouvez toujours Auto Layout difficile à utiliser, vous pouvez utiliser la méthode viewDidLayoutSubviews pour ajuster automatiquement la taille de la vue. J'ai une vue tableau qui a le même problème que vous. J'ai donc utilisé cette méthode simple pour modifier l'insert de contenu de la vue tableau:

-(void)viewDidLayoutSubviews {
    [self.tableView setContentInset:UIEdgeInsetsMake(self.topLayoutGuide.length, 0, 0, 0)];
}

Jusqu'à présent, cela fonctionne bien (en portrait et en paysage) sur tous les iDevices.

4
Supertecnoboff

Vous pouvez obtenir la hauteur à partir du guide de mise en page du contrôleur:

self.topLayoutGuide.length

La démo de @ Dilts fonctionne parce que le haut des étiquettes est contraint par le guide de disposition supérieur. Si elles sont contraignantes pour le survol, cela ira également derrière le bar. 

4
crab oz

Pour répondre à votre question: "quelle est la hauteur de la barre de navigation très haute":

 iMessage App Extension NavBar height

C'est 86px.

METTRE À JOUR

À propos de la barre de navigation cachant votre interface utilisateur. J'ai fait une démo rapide et je n'ai eu aucun problème. 

 Added labels At y position 20

J'ai ajouté quelques étiquettes en haut de la vue (juste sous la barre d'état, à la valeur du point y 20). Ensuite, j'ai ajouté 2 contraintes: espace de début et espace supérieur pour l'étiquette de gauche et espace de queue et espace supérieur pour l'étiquette de droite. 

 Result

Ce fut mon résultat, à la fois en mode compact et élargi. Veillez simplement à placer vos composants sous la valeur y-point-20 et à respecter certaines contraintes. Ainsi, Apple redimensionnera la vue!

2
Lucas

Si vous définissez le guide de disposition supérieur en tant que contrainte supérieure, cela fonctionne pour MSMessagesAppViewController. Mais cela ne fonctionnera pas sur UIViewControllers, car les guides de présentation sont différents.

Sauf si vous avez vraiment besoin d'utiliser une classe UIViewController pour une raison quelconque (exemple: MessagesAppViewControllers rencontre des difficultés pour contenir du code Obj C++), utilisez MSMessagesAppViewController.

1
Totoro

Pour le moment, avec Xcode 8.2, aucune des solutions ci-dessus ne fonctionne pour moi . @ Dilts answer ne fonctionnera que pour MessageViewController, qui hérite de MSMessagesAppViewController. Mais lorsque nous essayons de faire de même avec notre ViewController, qui hérite de UIViewController, cela ne fonctionnera pas.

Je l’ai fait en liant Top Constraint en ce qui concerne la vue plutôt que le guide Top Layout. Je règle la contrainte top à zéro par rapport à view et la lie sous la forme topLayout.

@IBOutlet weak var topLayout: NSLayoutConstraint!

Et puis changez la valeur de la contrainte par programmation lors du changement de style de présentation.

override func willTransition(to presentationStyle: MSMessagesAppPresentationStyle) {
        // Called before the extension transitions to a new presentation style.

        if presentationStyle == .compact{
            mediaViewController?.topLayout.constant = 0.0
        }else{

            mediaViewController?.topLayout.constant = 86.0
        }

    }

 enter image description here

Mode compact

 enter image description here

Mode étendu

 enter image description here

0
technerd

Ceci est une réponse acceptée en Objective-C

[view.topAnchor constraintEqualToAnchor:[self.topLayoutGuide bottomAnchor]].active = YES;
0
Josip B.
    [self.view addConstraints: [NSArray arrayWithObjects:

                            [NSLayoutConstraint constraintWithItem:YourViewHere
                                                         attribute:NSLayoutAttributeTop
                                                         relatedBy:NSLayoutRelationEqual
                                                            toItem:self.topLayoutGuide
                                                         attribute:NSLayoutAttributeBottom
                                                        multiplier:1.0
                                                          constant:0.0],

                            [NSLayoutConstraint constraintWithItem:YourViewHere
                                                         attribute:NSLayoutAttributeBottom
                                                         relatedBy:NSLayoutRelationEqual
                                                            toItem:self.bottomLayoutGuide
                                                         attribute:NSLayoutAttributeTop
                                                        multiplier:1.0
                                                          constant:0.0],

                            [NSLayoutConstraint constraintWithItem:YourViewHere
                                                         attribute:NSLayoutAttributeLeft
                                                         relatedBy:NSLayoutRelationEqual
                                                            toItem:[self view]
                                                         attribute:NSLayoutAttributeLeft
                                                        multiplier:1.0
                                                          constant:0.0],

                            [NSLayoutConstraint constraintWithItem:YourViewHere
                                                         attribute:NSLayoutAttributeRight
                                                         relatedBy:NSLayoutRelationEqual
                                                            toItem:[self view]
                                                         attribute:NSLayoutAttributeRight
                                                        multiplier:1.0
                                                          constant:0.0], nil]];
0
danchik