[img]https://i.sstatic. net/jt1cIK9F.gif[/img]

У меня есть уже давно этим занимаюсь и не могу понять. Я новичок в Swift, и это не помогло, но по сути таблица должна иметь возможность прокручиваться по горизонтали и вертикали (но не одновременно, поэтому не должно быть никакой «диагональной» прокрутки) и должна иметь закрепленную строку заголовка (которая « pushs" в конце таблицы) и закрепленный столбец.
Я видел это в двух разных приложениях, поэтому мне кажется, что это должно быть относительно просто, но я не могу этого понять. верно. Я использую SwiftUI, но, возможно, он слишком сложен, и мне нужно вернуться к UIKit.
Вот что-то близкое:
import SwiftUI
struct Team {
let teamId: Int
let city: String
let name: String
}
struct ScrollableTableView: View {
@State private var teams = [
Team(teamId: 1610612737, city: "Atlanta", name: "Hawks"),
Team(teamId: 1610612738, city: "Boston", name: "Celtics"),
Team(teamId: 1610612739, city: "Cleveland", name: "Cavaliers"),
Team(teamId: 1610612740, city: "New Orleans", name: "Pelicans")
]
var body: some View {
let columns = [
GridItem(.fixed(120), alignment: .leading), // Pinned first column
GridItem(.fixed(150), alignment: .leading),
GridItem(.fixed(200), alignment: .leading)
]
ScrollView([.vertical], showsIndicators: true) {
ZStack {
ScrollView([.horizontal]) {
LazyVGrid(columns: columns, alignment: .leading, pinnedViews: [.sectionHeaders]) {
// Pinned Header Section
Section(header: headerView) {
// Table Rows
ForEach(teams) { team in
Section(header: Text("") // Pinned column
.frame(height: 40)
.padding(.horizontal, 4)) {
Text(team.city)
.frame(height: 40)
.padding(.horizontal, 4)
.border(Color(.separator), width: 0.5)
Text(team.name)
.frame(height: 40)
.padding(.horizontal, 4)
.border(Color(.separator), width: 0.5)
}
.background(Color(.systemBackground))
}
}
}
}
LazyVGrid(columns: [columns[0]], alignment: .leading, pinnedViews: [.sectionHeaders]) {
Section(header: Text("Team ID")
.frame(width: 120, height: 40, alignment: .leading)
.bold()
.padding(.horizontal, 4)
.background(Color(.systemGray5))
.border(Color(.separator), width: 0.5)) {
ForEach(teams) { team in
Text(String(team.teamId)) // Pinned column
.frame(width: 120, height: 40)
.padding(.horizontal, 4)
.background(Color(.systemGray6))
.border(Color(.separator), width: 0.5)
}
}
}
}
}
.border(Color(.separator), width: 1)
}
private var headerView: some View {
HStack(spacing: 0) {
Text("")
.frame(width: 120, height: 40, alignment: .leading)
.bold()
.padding(.horizontal, 4)
.background(Color(.systemGray5))
.border(Color(.separator), width: 0.5)
Text("City")
.frame(width: 150, height: 40, alignment: .leading)
.bold()
.padding(.horizontal, 4)
.background(Color(.systemGray5))
.border(Color(.separator), width: 0.5)
Text("Name")
.frame(width: 200, height: 40, alignment: .leading)
.bold()
.padding(.horizontal, 4)
.background(Color(.systemGray5))
.border(Color(.separator), width: 0.5)
}
.background(Color(.systemGray5))
}
}
#Preview {
ScrollableTableView()
}
Подробнее здесь: https://stackoverflow.com/questions/793 ... icky-table
Мобильная версия