ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

SwiftyPickerPopover 多列选择器:ColumnStringPickerPopover 联动布局高级用法详解

SwiftyPickerPopover 多列选择器:ColumnStringPickerPopover 联动布局高级用法详解 SwiftyPickerPopover 多列选择器ColumnStringPickerPopover 联动布局高级用法详解【免费下载链接】SwiftyPickerPopoverA more convenient way to display a popover with a built-in picker, on iPhone/iPad of iOS9.项目地址: https://gitcode.com/gh_mirrors/sw/SwiftyPickerPopoverSwiftyPickerPopover 是 iOS 开发者绕不开的一款开源弹窗选择器库而其中的多列选择器 ColumnStringPickerPopover更是处理「省市区」「餐品分类」「多级联动」等复杂场景的利器。本文将围绕ColumnStringPickerPopover 联动布局从基础初始化到高级定制手把手带你掌握这款 iOS9 兼容的多列选择器全部玩法新手也能快速上手。一、多列选择器是什么与单列的 StringPickerPopover 不同ColumnStringPickerPopover基于 UIPickerView 实现可以在一个弹出框内展示多列数据每一列独立滚动、独立选中最终一次性返回所有列的行号和选中值。它的核心特点多列展示每列数据互不干扰可自由滚动联动布局通过columnPercents灵活分配每列宽度实现主从联动效果iOS 9 全兼容iPhone / iPad 通用无需自己写 UIPopoverController⚡️链式调用API 设计简洁一行链式代码即可弹出对应的源码位于 ColumnStringPickerPopover.swift界面逻辑在 ColumnStringPickerPopoverViewController.swift默认布局由 ColumnStringPickerPopover.storyboard 提供。二、快速上手最基础的多列选择器用法初始化时需要四个参数先看 Demo 中的经典案例SampleViewController.swiftColumnStringPickerPopover(title: Columns Strings, choices: [[Breakfast, Lunch, Dinner], [Tacos, Sushi, Steak, Waffles, Burgers]], selectedRows: [0, 0], columnPercents: [0.5, 0.5]) .setDoneButton(action: { popover, selectedRows, selectedStrings in print(selected rows \(selectedRows) strings \(selectedStrings)) }) .setCancelButton(action: { _, _, _ in print(cancel) }) .appear(originView: sender, baseViewController: self)四个参数的含义参数类型作用titleString?弹窗顶部标题choices[[String]]嵌套数组外层是列内层是每列的选项selectedRows[Int]每一列默认选中的行号columnPercents[Float]每一列占弹窗总宽度的比例choices外层有几个数组界面就有几列这是理解多列选择器的第一步。三、联动布局核心columnPercents 列宽分配技巧联动布局的关键在于columnPercents参数它决定每一列在弹窗内的宽度占比所有值相加应约为 1.0。// 两列各占一半 columnPercents: [0.5, 0.5] // 主列宽、从列窄适合「主从联动」 columnPercents: [0.6, 0.4] // 三列联动例如「年/月/日」 columnPercents: [0.4, 0.3, 0.3]实现原理很简单查看 ColumnStringPickerPopoverViewController.swift 中widthForComponent的实现public func pickerView(_ pickerView: UIPickerView, widthForComponent component: Int) - CGFloat { return pickerView.frame.size.width * CGFloat(popover.columnPercents[component]) }每列宽度 弹窗总宽度 × 该列比例。主列给更大的比例内容更长的选项就能完整展示从列保持紧凑视觉上自然形成「主从联动」的层级感。四、高级技巧让数据真正联动起来多列选择器最常见的需求是第一列变了第二列的选项跟着变。虽然 ColumnStringPickerPopover 本身不会自动重算数据源但通过setValueChange(action:)监听 reload()刷新可以轻松实现联动效果。var categoryData [ [水果, 蔬菜], [[苹果, 香蕉, 橙子], [白菜, 萝卜, 番茄]] ] let popover ColumnStringPickerPopover(title: 分类联动, choices: [categoryData[0], categoryData[1][0]], selectedRows: [0, 0], columnPercents: [0.4, 0.6]) .setValueChange(action: { popover, rows, values in // 第一列变化时动态更新第二列数据 if rows[0] 1 { popover.choices [categoryData[0], categoryData[1][1]] popover.reload() } }) .setDoneButton(action: { _, rows, values in print(选中\(values)) }) popover.appear(originView: sender, baseViewController: self)核心思路三步走setValueChange(action:)中拿到最新的selectedRows根据主列行号从预置的数据源中取出对应的从列数据更新choices后调用reload()刷新界面reload()定义在 AbstractPopover.swift这样用户切换主分类时从列选项立即刷新完整体验到多列选择器联动布局的丝滑交互。五、显示值与原始值分离setDisplayStringFor 妙用实际业务中界面显示的文字往往与代码里存储的值不同。setDisplayStringFor闭包可以建立「原始值 → 显示值」的转换规则非常适合联动布局 数据映射的场景ColumnStringPickerPopover(title: 编码选择, choices: [[CN, US, JP], [BJ, NY, TK]], selectedRows: [0, 0], columnPercents: [0.5, 0.5]) .setDisplayStringFor { rawValue in switch rawValue { case CN: return 中国 case US: return 美国 case JP: return 日本 case BJ: return 北京 case NY: return 纽约 case TK: return 东京 default: return rawValue } } .setDoneButton(action: { _, rows, values in // values 返回的是原始编码而不是显示文字 print(values) // [CN, BJ] })用户看到的是中文回调里拿到的却是原始编码前后端数据无缝衔接。六、样式定制字体、字号、颜色逐列控制多列选择器支持按列独立设置样式让联动布局的主从列在视觉上更有层次ColumnStringPickerPopover(title: 样式定制, choices: [[早餐, 午餐, 晚餐], [寿司, 牛排, 汉堡]], selectedRows: [0, 0], columnPercents: [0.5, 0.5]) .setFonts([UIFont.boldSystemFont(ofSize: 14), nil]) // 主列加粗 .setFontColors([nil, .red]) // 从列红色 .setFontSizes([20, nil]) // 主列放大字号 .setSelectedRows([0, 2]) .appear(originView: sender, baseViewController: self)setFonts(_:)每列字体传nil使用默认值setFontColors(_:)每列文字颜色setFontSizes(_:)每列字号可覆盖字体自带大小setSelectedRows(_:)弹窗出现前预设选中行数组中的nil表示该列沿用默认样式非常灵活。七、清空按钮与自动消失体验优化两件套setClearButton可以为弹窗底部添加 Clear 按钮一键将所有列回滚到第 0 行结合disappearAutomatically(after:)还能让弹窗几秒后自动关闭配合多列选择器联动布局使用效果更佳let p ColumnStringPickerPopover(title: 快捷选择, choices: [[A, B, C], [1, 2, 3]], selectedRows: [0, 0], columnPercents: [0.5, 0.5]) .setClearButton(title: 清空, action: { _, _, _ in print(已清空) }) .setDoneButton(action: { _, _, values in print(values) }) p.appear(originView: sender, baseViewController: self) p.disappearAutomatically(after: 3.0)Clear 按钮的实现细节在 ColumnStringPickerPopoverViewController.swift 的tappedClear方法中它会遍历所有列并selectRow(0)同时触发清空回调。八、常见问题与避坑指南列数与数组不匹配崩溃columnPercents、selectedRows的元素个数必须与choices的列数一致否则会越界。联动刷新丢失选中态更新choices后记得同步调用setSelectedRows或reload()否则新数据源的行号对不上。弹窗宽度不足选项文字过长时适当调大主列columnPercents或用setSize(width:height:)增大整体弹窗尺寸。iPhone 上的显示得益于AbstractPickerPopoverViewController的adaptivePresentationStyle返回.noneiPhone 上也能以 popover 形式展示无需额外处理。九、总结SwiftyPickerPopover 的ColumnStringPickerPopover 多列选择器把复杂的 UIPickerView 弹窗封装成了几行链式代码。掌握columnPercents列宽分配、setValueChange联动刷新、setDisplayStringFor值映射这三大核心技巧你就能轻松应对绝大多数多级选择场景。从「快速上手」到「联动布局」希望这篇文章能帮你少走弯路把更多时间花在真正的业务逻辑上。【免费下载链接】SwiftyPickerPopoverA more convenient way to display a popover with a built-in picker, on iPhone/iPad of iOS9.项目地址: https://gitcode.com/gh_mirrors/sw/SwiftyPickerPopover创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表