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. Merci pour l'aide
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
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.
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.
Pour répondre à votre question: "quelle est la hauteur de la barre de navigation très haute":
C'est 86px.
À 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.
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.
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!
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.
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
}
}
Mode compact
Mode étendu
Ceci est une réponse acceptée en Objective-C
[view.topAnchor constraintEqualToAnchor:[self.topLayoutGuide bottomAnchor]].active = YES;
[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]];