You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 12:10:34