반응형
SwiftUI 로 리뉴얼 작업을 하는 중인데, 더 불러오기 작업을 하면서 문제가 생겼다.
1. ScrollView + LazyVStack
ScrollView(showsIndicators: false) {
LazyVStack(alignment: .leading, spacing: 0) {
ForEach(0 ..< feature.state.postList.count, id: \.self) { index in
CardView(...)
.onAppear {
if index == cardList.count - 1 {
// load more
}
}
}
}
}
이런 식으로 ScrollView 안에 LazyVStack 넣어서 기능 구현은 다 되었는데,
CardView에 onAppear 로 마지막 카드가 화면에 뜨는 걸 감지할 수 있을 줄 알았더니, 화면에 보이는 것과 상관없이 그냥 데이터 불러옴과 동시에 모든 카드에 onAppear가 동시 호출 되는 것이었다!!
onAppear 는 포기하고 gpt와 claude 가 알려준 대로 GeometryReader 사용해서 scroll offset 으로 감지를 하고 load more 하려고 했지만.... offset 감지 드럽게 안되는구만
그래서 ScrollView 아예 빼버리고 List로 돌림
2. List
List {
ForEach(0..<cardList.count, id: \.self) { index in
CardView(...)
.onAppear {
if index == cardList.count - 1 {
// load more
}
}
}
.buttonStyle(PlainButtonStyle())
.listRowSeparator(.hidden)
.listRowInsets(.init())
}
.hideScrollIndicator()
list 뭔가 예전에 불편한 게 있어서 잘 안썼는데 꽤 쓸만한걸?
default 탑재된 친구들 modifier 써서 초기화(?)해주고 scroll indicator만 잘 숨겨주면 onAppear 감지는 아주 잘된다! 굿굿
func hideScrollIndicator() -> some View {
if #available(iOS 16.0, *) {
return self.scrollIndicators(.hidden)
} else {
return self.onAppear {
UITableView.appearance().showsVerticalScrollIndicator = false
}
}
}
728x90
반응형
'Swift iOS 앱 개발 > SwiftUI' 카테고리의 다른 글
[SwiftUI] @EnvironmentObject 와 @StateObject 비교 (+ 앱 초기 설정) (1) | 2024.08.14 |
---|---|
[SwiftUI] TextEditor background color change - scrollContentBackground + iOS 15 (0) | 2024.07.09 |