web-dev-qa-db-fra.com

Disposition spécifique à l'appareil avec SwiftUI sur Apple Watch et iPhone

Parfois, je dois faire des ajustements spécifiques à l'appareil pour les dispositions. Par exemple, je devrai peut-être réduire l'espacement sur un iPhone avec un écran plus petit ou augmenter l'espacement sur les écrans les plus grands. Avec UIKit (et même Interface Builder), il était facile de faire des exceptions de disposition pour des classes de taille spécifiques. Quelle est la meilleure façon de faire des dispositions conditionnelles spécifiques à l'appareil avec SwiftUI?

J'ai parcouru la documentation SwiftUI et je n'ai pas trouvé de moyen d'accéder à ce type d'informations et de les utiliser dans les mises en page.

Voici un exemple pour une application Apple Watch. Selon les directives de conception d'Apple, j'ajoute 8,5 points de rembourrage à gauche et à droite sur la série 40 mm 4. Cependant, la 44 mm devrait avoir 9,5 points de remplissage, et tout Apple Watch plus ancien que la série 4 ne devrait pas avoir de remplissage.

Quelle est la meilleure façon d'y parvenir avec SwiftUI?

struct ContentView : View {

    var body: some View {
        HStack {
            Text("Hello World")
        }.padding([.horizontal], 8.5)
    }
}
7
gohnjanotis

Pour iPhone, je peux utiliser l'environnement comme ceci:

@Environment(\.horizontalSizeClass) var horizontalSizeClass: UserInterfaceSizeClass?

Et puis dans var body: certains View, j'ai fait cela pour gérer la façon dont une image serait mise à l'échelle en fonction de la taille de l'écran. A fait un tas de tests sur iPad et iPhone X et plus. Je suis sûr qu'il existe d'autres moyens. C'est au moins une façon d'utiliser les classes de taille dans SwiftUI. Il n'y a pas encore beaucoup d'informations sur la façon d'utiliser les classes de taille.

Image("logo")
      .opacity(1.0)
      .scaleEffect(makeCircleTextBig ? (horizontalSizeClass == .compact ? 0.18 : 0.25) : (horizontalSizeClass == .compact ? 0.06 : 0.1))
      .animation(.easeIn(duration: 1.0))

Consultez également ControlSize: Apple Docs ControlSize

Et vérifiez ceci pour une approche différente: Hacking With Swift: classes de taille SwiftUI

0
D. Rothschild

@gohnjanotis, vous ne savez pas trop s'il est trop tard, mais avez-vous essayé d'ajouter un retour devant GeometryReader? J'obtiens souvent cette erreur lorsque j'utilise certaines conditions, laissez etc. avant la création de la vue réelle. Il devrait donc ressembler à ceci:

var body: some View {
        return GeometryReader { proxy in
          if proxy.size.width > 324.0/2.0 { // 40mm watch resolution in points
            Text("BIG view here")
          } else {
            Text("small view here")
          }
        }
    }
0
appsailor