iOS 13 手势响应范围问题
https://stackoverflow.com/questions/62864858/swiftui-tap-gesture-does-not-work-inside-scrollview
iOS 13 在 ScrollView 内部使用 GeometryReader,会使 GeometryReader 内部的试图手势挂掉。
iOS 14 修复了这个问题。
瀑布流重用问题
iOS 13 中,瀑布流在 SwiftUI 中使用 ScrollView 加 VStack 和 HStack 实现。
在 iOS 14 中, 可以使用 ScrollView 加 LazyHGrid 和 LazyVGrid 替代。
在 iOS 14 直线,目前只有 List 是基于 UITableView 实现的,存在复用的机制。
关于 List 在 iOS 15 和 iOS 15 之下的表现形式不一样的问题
关于 List 在不同版本的讨论:https://stackoverflow.com/questions/56553672/how-to-remove-the-line-separators-from-a-list-in-swiftui-without-using-foreach
- 在 iOS 13 中,建议使用下面代码去掉分割线
import Introspect
List {
}.introspectTableView { tableView in
tableView.separatorStyle = .none
}
- 在 iOS 14 中,实现方式, 虽然去掉了分割线,但是这是另一个样式,会存在头部空白的问题
.listStyle(SidebarListStyle()) # IOS 14
- 关于给 List 添加 Load More 的问题,
- 使用 MJRefresh 包装实现的问题,默认就出现在底部,失去了本身的手势交互
- 通过使用 offset 实现
使用 offset 的实现,在 iOS 15 中表现正常,在低于 iOS 15 版本中表现为,直接出现在底部,offset 失效,所以没有触发 Load More 事件。
extension Refresh.Footer: View {
public var body: some View {
if !noMore, update.refresh, !refreshing {
DispatchQueue.main.async {
self.refreshing = true
self.action()
}
}
return Group {
if update.enable {
VStack(alignment: .center, spacing: 0) {
if refreshing || noMore {
label()
Spacer()
} else {
EmptyView()
.frame(maxHeight: 0)
}
}
.frame(maxWidth: .infinity)
} else {
EmptyView()
}
}
.listRowInsets(.init(top: 0, leading: 0, bottom: 0, trailing: 0))
.anchorPreference(key: Refresh.FooterAnchorKey.self, value: .bounds) {
if self.noMore || self.refreshing {
return []
} else {
return [.init(bounds: $0, preloadOffset: self.preloadOffset, refreshing: self.refreshing)]
}
}
}
}