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:
Il semble que j'ai besoin de quelque chose comme measure
dans React.
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