J'essaie d'implémenter une vue sous forme de tableau avec des éléments horizontaux défilables (avec un nombre inconnu d'éléments) comme dans l'illustration ci-dessous:
L'interface utilisateur devrait se comporter comme suit:
J'ai pensé à utiliser TableView et dequeueReusableCellWithIdentifier
et à créer une cellule prototype, mais je dois ensuite me rappeler la position horizontale de la liste et l'initialiser correctement sur cellForRowAtIndexPath
, ce qui affectera probablement les performances.
Q: Quelle disposition utiliseriez-vous pour atteindre cet objectif, toute entrée/tutoriel serait apprécié
Utilisez un UITableView
et ajoutez un UICollectionView
à votre cellule tableView réutilisable. UICollectionView
fonctionne de manière similaire à UITableView
en ce que les "éléments" (comme les cellules) sont réutilisables et instanciés uniquement lorsqu'ils apparaissent à l'écran. J'ai fait une recherche rapide sur Google pour les tutoriels et j'ai trouvé ICollectionView in UITableViewCell . Vérifiez cela et quelques autres questions de StackOverflow concernant la conception et vous devriez être en or.
L'utilisation de UIScrollView
peut nécessiter des efforts importants s'il y a une grande quantité d'éléments d'interface utilisateur dans chaque vue de défilement, car vous devez instancier tous ceux-ci à l'avance. Une meilleure solution consiste à définir votre UITableViewCell
personnalisé, qui a son propre UITableView
mais tourné à 90 degrés pour le défilement horizontal. Les éléments d'interface utilisateur à l'intérieur ne seront créés que lorsqu'ils doivent être affichés à l'aide de dequeueReusableCellWithIdentifier:forIndexPath:
. Veuillez consulter un exemple de code sur la création d'une vue de table pivotée à 90 degrés:
iPhone Tableview Utiliser les cellules dans le défilement horizontal et non vertical
Vous pouvez utiliser un objet ScrollView pour le placer dans votre table et définir les valeurs "Verrouillage directionnel activé" et "Paging activés" sur true pour l'affichage en défilement.
Dans swiftUI, vous pouvez utiliser la puissance de Stack
s et ScrollView
à côté de List
(si vous le souhaitez):
struct ContentView: View {
var verticalData = 0...3
var horizontalData = 0...15
var body: some View {
List(self.verticalData, id: \.self) { vData in
ScrollView(.horizontal) {
HStack(spacing: 16) {
ForEach(self.horizontalData, id: \.self) { _ in
Circle()
.foregroundColor(.blue)
.frame(width: 40, height: 40, alignment: .center)
}
}
}
}
}
}
Dans cet exemple, j'ai utilisé List
pour les données verticales et un ScrollView
horizontal contenant une HStack
(pile Horizonl) de cercles.
Le code suivant est le seul à reproduire une vue identique à votre illustration (4 ans plus tard sur iPhone Xs):
struct CircleView: View {
var body: some View {
Circle()
.foregroundColor(.blue)
.frame(width: 80, height: 80, alignment: .center)
}
}
struct RowView: View {
var body: some View {
ScrollView(.horizontal) {
HStack(spacing: 16) {
VStack(alignment: .leading, spacing: 4) {
Text("Label")
Text("Some text here")
}
ForEach(0...15, id: \.self) { _ in
CircleView()
}
}
.padding(16)
}
}
}
struct ContentView: View {
var body: some View {
List {
ForEach(0...3, id: \.self) { _ in
RowView()
}.listRowInsets(EdgeInsets())
}
}
}