web-dev-qa-db-fra.com

puis-je obtenir la position d'une «vue» après la mise en page dans SwiftUI?

Existe-t-il un moyen d'obtenir le cadre d'un View après la mise en page? Je voudrais tracer une ligne reliant deux vues après que la mise en page les a positionnées:

enter image description here

Il semble que j'ai besoin de quelque chose comme measure dans React.

6
Taylor

Pour exporter les coordonnées de la vue "telles que rendues", j'ai créé un ensemble de tableaux pour les coordonnées x, y et les ai enregistrées dans l'objet Modèle. Cependant, je ne devais PAS les encapsuler dans @Published var, au lieu de les conserver comme "var", sinon vous entrez dans une boucle infinie de mise à jour des coordonnées, puis de nouveau rendu la vue.

À l'aide du didacticiel "historique" d'Apple, l'objet Modèle a été modifié comme suit:

import SwiftUI
import Combine

final class UserData: ObservableObject {
  @Published var showFavoritesOnly = false
  @Published var landmarks = landmarkData
 var circleImageX = Array(repeating: 0.0, count:20)
 var circleImageY = Array(repeating: 0.0, count:20)

}

Ensuite, écrivez dans ces tableaux chaque fois que CircleImage.Swift est rendu à l'aide du code suivant, toujours à partir du didacticiel "landmark.Swift", en enregistrant les points médians du cadre.

import SwiftUI

struct CircleImage: View {
  @EnvironmentObject var userData: UserData
  var landmark: Landmark

  var landmarkIndex: Int {
    userData.landmarks.firstIndex(where: {$0.id == landmark.id})!
  }
  var body: some View {

    ZStack {
      landmark.image
        .clipShape(Circle())
        .overlay(Circle().stroke(Color.white, lineWidth: 4))
        .shadow(radius: 10)
      VStack {

        GeometryReader { geometry -> Text in
          let frame = geometry.frame(in: CoordinateSpace.global)
          self.userData.circleImageX[self.landmarkIndex] = Double(frame.midX)
          return
            Text("\(frame.midX)")
              .foregroundColor(.red)
              .bold()
              .font(.title)
        }
        .offset(x: 0.0, y: 50.0)
        GeometryReader { geometry -> Text in
          let frame = geometry.frame(in: CoordinateSpace.global)
          self.userData.circleImageY[self.landmarkIndex] = Double(frame.midY)
          return
            Text("\(frame.midY)")
              .foregroundColor(.red)
              .bold()
              .font(.title)
        }
        .offset(x: 0.0, y: -50.0)
      }
    }
  }
}`

Non seulement cela enregistre les coordonnées rendues, mais les rend également sous forme de vue Texte superposée à l'image comme suggéré par Jake. Naturellement, vous pouvez supprimer la vue de superposition de texte une fois que vous êtes satisfait que les coordonnées sont correctes. J'espère que cela t'aides

1
grapeffx