美文网首页
SwiftUI 在 iOS 13 中的问题

SwiftUI 在 iOS 13 中的问题

作者: Ian_ | 来源:发表于2022-07-15 11:04 被阅读0次

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

  1. 在 iOS 13 中,建议使用下面代码去掉分割线
import Introspect
 
List {

}.introspectTableView { tableView in
    tableView.separatorStyle = .none
}
  1. 在 iOS 14 中,实现方式, 虽然去掉了分割线,但是这是另一个样式,会存在头部空白的问题
.listStyle(SidebarListStyle()) # IOS 14
  1. 关于给 List 添加 Load More 的问题,
  2. 使用 MJRefresh 包装实现的问题,默认就出现在底部,失去了本身的手势交互
  3. 通过使用 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)]
            }
        }
    }
}

相关文章

网友评论

      本文标题:SwiftUI 在 iOS 13 中的问题

      本文链接:https://www.haomeiwen.com/subject/bbiqirtx.html