Dans mon application universelle, je remplace actuellement supporté d'interventions code> dans le contrôleur de visualisation de la fenêtre pour définir les orientations autorisées. Jusqu'à présent, la décision était basée sur l'interface utilisateur de l'appareil IDIOM:
- (NSUInteger) supportedInterfaceOrientations
{
// Note the hypothetical UIDevice method "landscapeSizeClass"
if ([[UIDevice currentDevice] landscapeSizeClass] == UIUserInterfaceSizeClassCompact)
return (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown);
else
return UIInterfaceOrientationMaskAll;
}
4 Réponses :
Manquant d'une API officielle Apple, c'est la solution de contournement que j'ai proposée:
- (NSUInteger) supportedInterfaceOrientations { if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) { // iPhone 5S and below: 320x480 // iPhone 6: 375x667 // iPhone 6 Plus: 414x736 CGSize screenSize = [UIScreen mainScreen].bounds.size; // The way how UIScreen reports its bounds has changed in iOS 8. // Using MIN() and MAX() makes this code work for all iOS versions. CGFloat smallerDimension = MIN(screenSize.width, screenSize.height); CGFloat largerDimension = MAX(screenSize.width, screenSize.height); if (smallerDimension >= 400 && largerDimension >= 700) return UIInterfaceOrientationMaskAll; else return (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown); } else { // Don't need to examine screen dimensions on iPad return UIInterfaceOrientationMaskAll; } }
Euh c'est à peu près mon deuxième commentaire là-bas avec exactement mate .. Il suffit de supprimer les trucs userdudiom, il est obsolète et inutile, iPad tombera à travers le bon côté de la fissure de toute façon ...
@JEF J'aurais demandé d'écrire votre commentaire comme une réponse à l'exception de la manipulation de l'Usersidiom. Où dit-il que cela est obsolète? Et je ne suis pas pleinement d'accord pour dire que c'est inutile - cela peut être inutile aujourd'hui, mais qu'en est-il de demain lorsque Apple fait ressortir un nouveau micro iPad qui est légèrement inférieur à ces valeurs de seuil codées?
Whoops, mon mauvais. Je l'ai eu de la Session WWDC où ils ont introduit les cours de taille fin de l'année dernière, peut-être que l'ingénieur a peut-être déclaré qu'elle sera bientôt obsolète et que je l'ai confondu. Avec l'UISPLITVIEWCONTROLLER UISPLITVIEWCONTROLLER 6+ SOUTENANT, UIPOPOVERCONTROLLER, lancement à partir de Springboard dans le paysage, etc. Il est certainement perdu toute utilité en tout cas. Pensez-vous honnêtement qu'il pourrait y avoir un futur iPad qui est plus petit que certains iPhones? ce serait assez drôle ....
Je préférerai utiliser des macros pour découvrir que (pour des raisons de lisibilité), avec quelque chose comme: , puis: p> Édité: p> Il peut mieux avoir cette macro macro à la place is_iphone_6p et is_ipad: p> puis: p>
C'est ce qu'on appelle une solution "fragile". Alors, que se passe-t-il si l'iPhone 6S + a un écran de 740 pixels?
C'est pourquoi j'ai défini "écran_max_length> = 736.0" dans la solution modifiée. Mais de toute façon, les deux devraient être temporairement des solutions Til Apple fournit une meilleure façon.
- (NSUInteger) supportedInterfaceOrientations { if (self.traitCollection.displayScale == 3.0 || (self.traitCollection.verticalSizeClass == UIUserInterfaceSizeClassRegular && self.traitCollection.horizontalSizeClass == UIUserInterfaceSizeClassRegular)) { return UIInterfaceOrientationMaskAll; } else { return (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown); } }
Cela ne fonctionne pas. Par exemple, votre solution renvoie uiterfaceorientationmaskall code> Même pour les petits appareils tels que iPhone 4S, car ceux-ci ont une classe de taille verticale
uiuserinterfacesizeclassgulaire code>. Et si vous essayez de penser à cela, oubliez cela, cela ne fonctionnera pas: les classes de taille pour iPhone 6+ en orientation portrait sont les mêmes que les classes de taille pour, disons, iPhone 4s, donc le Deux appareils sont pratiquement indiscernables tant qu'ils sont en orientation portrait.
Je ne suis pas convaincu. DISPLAYSCALE CODE> Peut fonctionner pour le moment, convenu, mais dès que Apple libère la prochaine génération d'iPhones (qui aura probablement tous
displayscale code> == 3.0) Cette solution va probablement casser encore. Une solution fiable, imo, doit en quelque sorte être capable de mesurer les dimensions de l'écran dans le paysage, quelle que soit l'orientation actuelle du périphérique i>. Si cette mesure est prise en points (ma solution actuelle), ou sous une forme abstraite (par exemple la classe de taille) est secondaire.
FWIW, l'équivalent de Réponse de Herzbube à Swift 1.2: Personnellement, je préfère le style suivant: p>
Venez avec vos propres classes de taille Substitut, j'en ai fait un dans ma réponse ici par exemple Stackoverflow.com/Questtions/28423001/...
Je suis arrivé avec quelque chose de similaire, bien que beaucoup plus simple que ce que vous avez fait. Je posterai ma solution dans une journée ou deux, mais laissez-moi voir d'abord si quelqu'un peut tirer un lapin de son chapeau :-)
Bool Allowlandscape = (([[[[[[[[[[[[[Uisreen Mainscreen] .bounds.Size.Deight> 800) || ([[Usreen Mainscreen] .bounds.Size.Width> 800)); Que diriez-vous alors?