web-dev-qa-db-fra.com

Interface Builder: A quoi servent les deltas iOS 6/7 de UIView?

Je viens de remarquer la propriété iOS 6/7 Delta qui se trouve sous la structure de structs d'UIView.

A quoi cela sert-il et pourquoi manque-t-il dans AutoLayout?

enter image description here

110
Frederick C. Lee

Cela fait en fait référence au delta entre la position de la disposition de iOS6 à iOS7. 

Dans iOS7, certaines vues peuvent masquer la barre d'état ou la rendre transparente. En fait, elle est superposée au-dessus de votre vue. Ainsi, si vous mettez un élément d'interface utilisateur à (0.0, 0.0) sur iOS6, il apparaîtra sous la barre d'état, mais sous iOS7, il apparaîtra partiellement couvert sous la barre d'état. Dans ce cas, vous souhaitez donc un delta correspondant à la hauteur de la barre d'état (20,0 points), de sorte que la présentation ait la même apparence dans iOS6 et iOS7. 

Je pense que ce n'est pas nécessaire si vous utilisez l'autolayout, mais bien sûr, vous perdez alors le support iPad1, ce que beaucoup d'entre nous ne sont pas disposés à concéder pour l'instant. 

83
digarok

Remarque: j'ai remarqué cette question il y a quelque temps, mais je ne fais que poster ma réponse car la NDA a été levée

Pourquoi n'apparaît-il pas pour AutoLayout?

Comme vous l'avez peut-être remarqué, iOS 7 apporte un tout nouveau look. L'apparence des éléments de l'interface utilisateur a changé, mais certaines de leurs tailles (ou métriques en général) ont également changé. Cela peut rendre la conception d'interface compatible avec iOS 7 et ses prédécesseurs un peu pénible.

La ligne officielle d'Apple est d'utiliser AutoLayout pour résoudre ce problème. cela devrait vous éviter beaucoup de tracas pour la mise en forme des éléments de l'interface utilisateur. Il est parfois difficile d'intégrer cela, notamment si vous devez toujours prendre en charge iOS 5 pour des raisons professionnelles ou si vos interfaces sont gérées de manière à rendre difficile la mise en œuvre d'AutoLayout. En tant que tel, Apple semble avoir fourni un moyen de faciliter votre travail si vous tombez dans cette catégorie de niche. Ils ont appelé cet appareil iOS 6/7 Deltas.

Ok alors, que fait-il?

Bien que le libellé d’Interface Builder ne précise pas ce que signifie «Delta» dans ce contexte, le code contenu dans le fichier .xib correspondant à cette fonctionnalité est un peu plus clair:

<inset key="insetFor6xAndEarlier" minX="-50" minY="-100" maxX="-50" maxY="300"/>

Le nom de clé insetFor6xAndEarlier indique explicitement ce que cela fait; vous pouvez fournir des insertions alternatives pour les éléments d'interface utilisateur lorsqu'elles sont exécutées sur les prédécesseurs de iOS 7. Par exemple, ce qui précède définit le changement de delta suivant:

x: 50
y: 100
width: -100
height: 200

Bien que les valeurs stockées dans le fichier .xib ne correspondent pas directement aux valeurs citées, il existe une corrélation entre elles. 

x: -minX
y: -minY
width: minX + maxX
height: minY + maxY

Les images ci-dessous montrent ce changement visuellement. C'est un exemple assez extrême, mais c'est pour démontrer sa capacité. Je n’attendrais en pratique que des modifications delta de quelques pixels seulement.

iOS7 View

iOS6 View

Vous remarquerez peut-être que les valeurs sont l'inverse pour la vue iOS 6; En effet, les deltas sont relatifs au type de vue avec lequel vous travaillez. Si vous éditez pour iOS 6, les deltas existent afin de transformer correctement l'élément pour iOS 7 (l'inverse de l'exemple ci-dessus).

Pour afficher les différents styles, vous pouvez modifier la façon dont Interface Builder le présente en fonction du système d'exploitation sur lequel il serait exécuté. Ceci est contenu dans l'inspecteur de fichier-> Interface Builder Document (1er onglet de la barre de droite), ainsi:

Interface Style Switch

Est-ce que cela existe si j'aime bien coder mon interface à la main?

Pas directement, mais vous pouvez facilement obtenir le même effet en effectuant des vérifications conditionnelles sur la version du système d'exploitation dans votre code et en définissant la position/taille correcte en conséquence. La capacité delta existe dans Interface Builder car il n'y aurait pas de moyen simple d'avoir un positionnement conditionnel sans code, mais le but d'Interface Builder est d'extraire le plus de code possible pour l'interface utilisateur.

Global...

Apple recommande vivement d'utiliser AutoLayout, cela vous simplifie la vie dans la plupart des cas. Si vous ne pouvez pas l'utiliser (pour les raisons susmentionnées), les deltas vous offrent la possibilité de positionner correctement les éléments de votre interface utilisateur, en fonction des métriques du système d'exploitation actuel, sans qu'il soit nécessaire de les repositionner manuellement dans le code. Un bon exemple consiste à corriger l'absence de barre d'état, mais il existe de nombreux autres cas d'utilisation.

Naturellement, si vous ne développez que pour iOS7 et les versions ultérieures, vous n'avez pas besoin de connaître cette fonctionnalité/vous ne la découvrirez pas. Si vous avez besoin que les appareils iOS6 exécutent votre application avec le SDK iOS7, sans autolayout, vous avez besoin de deltas.

Au moment de la rédaction de cet article (21 août), je ne trouve aucune documentation concernant cette fonctionnalité, ni aucune mention dans le contenu de WWDC. J'ai eu une pièce de théâtre et après quelques recherches, c'est ce que j'ai découvert.

108
WDUK

Je sais que la réponse à cette question a déjà été trouvée. Il suffit d'ajouter une petite variante dans l'espoir que cela pourrait également aider ceux qui n'utilisent pas la mise en page automatique et qui souhaitent toujours prendre en charge iOS 6.1 et les versions antérieures.

Lisez ceci Guide de transition d’Apple - Prise en charge d’une version antérieure

Choisissez "Afficher en tant que" sur "iOS 7.0 et versions ultérieures".

enter image description here

Interface de base pour iOS 7. Pour iOS 6, indiquez une valeur delta appropriée. Utilisez l'aperçu pour voir comment cela sera rendu dans les appareils iOS 7 et iOS 6.

enter image description here

Étapes rapides:

Sélectionnez chaque enfant immédiat de la vue racine individuellement et ajoutez 20 pixels à sa valeur «Y».

enter image description here

Ensuite, sélectionnez tous les enfants immédiats collectivement et donnez delta Y à -20 pixels. Vous pouvez également le faire en lot ou individuellement.

enter image description here

30
Saran

AutoLayout nécessite au moins iOS 6.0. Si vous souhaitez prendre en charge iOS 5.0, vous ne pouvez pas utiliser AutoLayout.

Et ces deltas sont utilisés pour vous aider à ajuster la position d'affichage sur différentes versions iOS (principalement iOS 7 et les versions iOS inférieures à 7).

J'utilise ces valeurs pour m'aider à aimer cette image .enter image description here

9
sunkehappy

Pour voir iOS 6/7 Delta en action, je vais effectuer une démonstration avec un SegmentedControl qui apparaît correctement sur les appareils iOS 6 et iOS 7.

Tout d’abord, sélectionnez votre fichier .Xib ou ViewController dans Storyboard. Décocher Utiliser autolayout et sélectionner "Voir comme iOS 7 et versions ultérieures"

enter image description here

Dans l'espace de travail d'Interface Builder, placez votre SegmentedControl de sorte que son Origin.y soit égal à 20. Sous iOS 6/7 Delta, choisissez -20 pour DeltaY.

enter image description here

Cela fera en sorte que votre SegmentedControl repose sous la barre d'état dans les appareils iOS 6 et iOS 7

enter image description hereenter image description here

Autres citations utiles de Guide du développeur de la barre d'état iOS 7

Les deltas peuvent être définis individuellement pour chaque vue et fonctionnent comme vous le feriez attendre. Si votre storyboard ou votre nib est configuré pour afficher iOS 6, alors définir les deltas entraînera le déplacement et/ou le redimensionnement de cette vue par le montant défini lorsqu'il est exécuté dans iOS 7. Sinon, si votre le storyboard ou la plume est configuré pour être affiché dans iOS 7, les deltas seront alors appliqué lors de l'exécution dans iOS 6

3
onmyway133

Si vous utilisez AutoLayout, Delta n’est pas disponible ..__ Essayez ceci (testé sur l’iPhone 4s sous iOS6):

- (void) viewWillLayoutSubviews {

//iOS 6 workaround offset
if ([[[UIDevice currentDevice] systemVersion] floatValue] < 7) {

    self.view.clipsToBounds = YES;
    CGRect screenRect = [[UIScreen mainScreen] bounds];
    CGFloat screenHeight = 0.0;
    screenHeight = screenRect.size.width;
    CGRect screenFrame = CGRectMake(0, -20, self.view.frame.size.width,self.view.frame.size.height+10);

    self.view.frame = screenFrame;
}
}
0
Marcelo dos Santos