SwiftUI是否基于UIKit?UIKit扩展影响SwiftUI选择器相关问询
关于SwiftUI Picker与UIKit UIPickerView的疑问解答
1. 为什么UIKit的UIPickerView扩展会影响SwiftUI的Picker?
SwiftUI里使用.wheel样式的Picker,底层是直接复用UIKit的UIPickerView实现的。你写的全局UIPickerView扩展会作用到所有实例化的UIPickerView上,自然也就影响了SwiftUI中基于它实现的滚轮样式Picker。
2. 掌握UIKit基础对学习SwiftUI有用吗?
当然有用,而且是非常关键的补充。SwiftUI虽说是声明式新框架,但在iOS平台上,很多组件的底层依然依赖成熟的UIKit实现。遇到自定义需求、兼容性bug(比如你碰到的iOS15手势重叠问题)时,懂UIKit能帮你快速定位问题根源,用底层扩展解决SwiftUI上层没提供方案的问题。
3. SwiftUI本质是UIKit库吗?学SwiftUI有意义吗?
SwiftUI不是UIKit的封装,它是苹果推出的独立声明式UI框架,有自己的语法和渲染逻辑,还支持跨iOS、macOS、watchOS、tvOS多平台开发。只是为了兼容现有生态、复用成熟组件,部分SwiftUI组件会调用UIKit的底层实现。
学习SwiftUI绝对有意义:它是苹果明确主推的未来UI开发方向,声明式语法比UIKit的命令式写法更简洁高效,开发速度更快,还能和UIKit混合开发,适配新系统特性也更及时。
解决iOS15选择器手势重叠问题的代码
extension UIPickerView { open override var intrinsicContentSize: CGSize { return CGSize(width: UIView.noIntrinsicMetric, height: 200) } }
对应的SwiftUI多选择器布局代码
GeometryReader { geometry in HStack(spacing: 0) { Picker(selection: self.$daySelection, label: Text("")) { ForEach(0 ..< self.days.count) { index in Text("\(self.days[index]) d").tag(index) } } .pickerStyle(.wheel) Picker(selection: self.$daySelection, label: Text("")) { ForEach(0 ..< self.days.count) { index in Text("\(self.days[index]) d").tag(index) } } .pickerStyle(.wheel) Picker(selection: self.$daySelection, label: Text("")) { ForEach(0 ..< self.days.count) { index in Text("\(self.days[index]) d").tag(index) } } .pickerStyle(.wheel) } }
多选择器效果展示

内容的提问来源于stack exchange,提问作者Alisher Baigazin
相关产品推荐
相关产品推荐

