SwiftyPickerPopover
这是在 iPhone/iPad 的 iOS9+ 上以简便方式显示内置选择器弹出窗口的一种更便捷的方法。
功能
- 通过简单的代码,您可以在 iPhone 或 iPad 上显示包含内置选择器的弹出窗口。
- Swift 5, iOS9+。使用自带的 UIPopoverController。
- 回调
截图
基本
DatePickerPopover(title: "DatePicker")
.setDoneButton(action: { _, selectedDate in print(selectedDate)})
.appear(originView: sender, baseViewController: self)
必需
- Swift 5, Xcode 11.
- iOS 9+
- CocoaPods 1.1.0.rc.2+ 或 Carthage 0.12.0+
许可协议
MIT
安装
CocoaPods
在您的 'Podfile' 中指定它,将 'YourProjectTargetName' 替换为您的目标名称
platform :ios, '9.0'
use_frameworks!
target ‘YourProjectTargetName’ do
pod 'SwiftyPickerPopover'
end
运行 'pod install'。
Carthage
- 将其添加到您的 Cartfile
github "hsylife/SwiftyPickerPopover"
- 运行
carthage update --platform iOS
- 将 'SwiftyPickerPopover.framework' 添加到项目中 '链接框架和库'。
- 将
/usr/local/bin/carthage copy-frameworks
添加到 '新的运行脚本阶段'。 - 将
$(SRCROOT)/Carthage/Build/iOS/SwiftyPickerPopover.framework
添加到 '输入文件'。
导入
在您的 .swift 文件中导入模块
import SwiftyPickerPopover
弹出类型
SwiftyPickerPopover 为您提供以下弹出层
- StringPickerPopover:具有允许用户选择 String 类型的 UIPickerView。
- ColumnStringPickerPopover:具有多列 UIPickerView。
- DatePickerPopover:具有允许用户选择 Date 类型选择的 UIDatePicker。
- CountdownPickerPopover:具有专门用于倒计时计时器样式的 UIDatePicker。
API 及示例
常见
所有弹窗都具有以下 API。
-
setPermittedArrowDirections()
-
setArrowColor()
-
setSize(width:,height:)
-
setCornerRadius()
-
setValueChange(action:)
-
setOutsideTapDismissing(allowed:)
-
setDimmedBackgroundView(enabled:)
-
appear(originView:, baseViewWhenOriginViewHasNoSuperview:, baseViewController:, completion:)
-
appear(barButtonItem:, baseViewWhenOriginViewHasNoSuperview:, baseViewController:, completion:)
-
disappear()
-
disappearAutomatically(after seconds:, completion:)
-
reload()
StringPickerPopover
-
init(title:, choices:)
-
setFont()
-
setFontSize()
-
setFontColor()
-
setImageNames()
-
setImages()
-
setSelectedRow()
-
setRowHeight()
-
setDisplayStringFor()
-
setDoneButton(title:, font:, color:, action:)
-
setCancelButton(title:, font:, color:, action:)
-
setClearButton(title:, font:, color:, action:)
可以这样使用 StringPickerPopover
StringPickerPopover(title: "StringPicker", choices: ["value 1","value 2","value 3"])
.setSelectedRow(0)
.setValueChange(action: { _, selectedDate in
print("current date \(selectedDate)")
})
.setDoneButton(action: { (popover, selectedRow, selectedString) in
print("done row \(selectedRow) \(selectedString)")
})
.setCancelButton(action: { (_, _, _) in print("cancel")}
)
.appear(originView: button, baseViewController: self)
StringPickerPopover 可以包含图片。
在将图像文件添加到您的目标 Assets.xcassets 之前
StringPickerPopover(title: "StringPicker", choices: ["value 1","value2",""])
.setImageNames(["Icon1",nil,"Icon3"])
.appear(originView: button, baseViewController: self)
它可以分离屏幕值和原始值
let displayStringFor:((String?)->String?)? = { string in
if let s = string {
switch(s){
case "value 1":
return "😊"
case "value 2":
return "😏"
case "value 3":
return "😓"
default:
return s
}
}
return nil
}
let p = StringPickerPopover(title: "StringPicker", choices: ["value 1","value 2","value 3"])
.setDisplayStringFor(displayStringFor)
.setDoneButton(action: {
popover, selectedRow, selectedString in
print("done row \(selectedRow) \(selectedString)")
})
.setCancelButton(action: { _, _, _ in
print("cancel")
})
p.appear(originView: sender, baseViewController: self)
p.disappearAutomatically(after: 3.0, completion: { print("automatically hidden")} )
指定大小
StringPickerPopover(title: "Narrow StringPicker", choices: ["value 1","value 2","value 3"])
.setSize(width: 250.0)
.appear(originView: sender, baseViewController: self)
弹出窗口的默认宽度和高度均为300.0。通过使用 setSize(width:, height:),您可以覆盖它或它们。当您将参数设置为 nil 或不指定它时,将使用默认值。
从 collectionView 的 cell 中弹出
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
let theCell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath)
let p = StringPickerPopover(title: "CollectionView", choices: ["value 1","value 2","value 3"])
.setSelectedRow(1)
.setDoneButton(title:"👌", action: { (popover, selectedRow, selectedString) in print("done row \(selectedRow) \(selectedString)") })
.setCancelButton(title:"🗑", action: { (_, _, _) in print("cancel")} )
p.appear(originView: theCell, baseViewWhenOriginViewHasNoSuperview collectionView, baseViewController: self)
}
如果 originView 没有父视图,那么您需要如上设置 baseViewWhenOriginViewHasNoSuperview 以指定箭头位置的 sourceView。如果有父视图,则 SwiftyPickerPopover 自动使用它作为 sourceView。
从 UIBarButtonItem 中弹出
let item: UIBarButtonItem = sender
let originView = item.value(forKey: "view") as! UIView
p.appear(originView: originView, baseViewController: self)
ColumnStringPickerPopover
-
init(title:, choices:, selectedRows:, columnPercents:)
-
setFonts()
-
setFontSizes()
-
setFontColors()
-
setSelectedRows()
-
setDisplayStringFor()
-
setDoneButton(title:, font:, color:, action:)
-
setCancelButton(title:, font:, color:, action:)
-
setClearButton(title:, font:, color:, action:)
ColumnStringPickerPopover 可以有多个字符串值
ColumnStringPickerPopover(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")})
.setFontSize(14)
.appear(originView: sender, baseViewController: self)
)
DatePickerPopover
-
init(title:)
-
setSelectedDate()
-
setDateMode()
-
setMinimumDate()
-
setMaximumDate()
-
setMinuteInterval()
-
setLocale()
-
setDoneButton(title:, font:, color:, action:)
-
setCancelButton(title:, font:, color:, action:)
-
setClearButton(title:, font:, color:, action:)
DatePickerPopover 可以这样使用
DatePickerPopover(title: "DatePicker")
.setDateMode(.date)
.setSelectedDate(Date())
.setDoneButton(action: { popover, selectedDate in print("selectedDate \(selectedDate)")})
.setCancelButton(action: { _, _ in print("cancel")})
.appear(originView: sender, baseViewController: self)
清除按钮会重置选择器。而且在指定秒数后会自动消失
let p = DatePickerPopover(title: "Clearable DatePicker")
.setDoneButton(action: { popover, selectedDate in print("selectedDate \(selectedDate)")} )
.setCancelButton(action: { _, _ in print("cancel")})
.setClearButton(action: { popover, selectedDate in
print("clear")
//Rewind
popover.setSelectedDate(Date()).reload()
})
p.appear(originView: sender, baseViewController: self)
p.disappearAutomatically(after: 3.0)
时间间隔是5分钟。箭头只允许向下方向。
DatePickerPopover(title: "DatePicker .time 5minInt.")
.setDateMode(.time)
.setMinuteInterval(5)
.setPermittedArrowDirections(.down)
.setDoneButton(action: { popover, selectedDate in print("selectedDate \(selectedDate)")} )
.setCancelButton(action: { _, _ in print("cancel")})
.appear(originView: sender, baseViewController: self)
)
CountdownPickerPopover
-
init(title:)
-
设置选择时间间隔
-
setDoneButton(title:, font:, color:, action:)
-
setCancelButton(title:, font:, color:, action:)
-
setClearButton(title:, font:, color:, action:)
CountdownPickerPopover 可以这样使用
CountdownPickerPopover(title: "CountdownPicker")
.setSelectedTimeInterval(TimeInterval())
.setDoneButton(action: { popover, timeInterval in print("timeInterval \(timeInterval)")} )
.setCancelButton(action: { _, _ in print("cancel")})
.setClearButton(action: { popover, timeInterval in print("Clear")
popover.setSelectedTimeInterval(TimeInterval()).reload()
})
.appear(originView: sender, baseViewController: self)
定制
如何定制弹幕的故事板?
当你准备你的自定义Storyboard时,它将自动应用。
- 找到你想要更改的Popover的Storyboard的原始文件。例如,'CountdownPickerPopover.storyboard'。
- 将它添加到你的Xcode项目中以包括到 mainBundle 中。此时,请查看 'If needed, copy items'。不要更改文件名。
- 接下来,更改默认指定的模块。在Xcode中打开Storyboard文件,取消选中 InterfaceBuilder > Identity inspector > Custom Class 中的 'Inherit From Target'。将 'Module' 指定为 'SwiftyPickerPopover'。
- 最后,自定义你的Storyboard文件。
贡献者
- Ken Torimaru GitHub 为 CountdownPickerPopover 和 ColumnStringPickerPopover 提供了贡献。
- BalestraPatrick GitHub 对于 README.md 中的拼写错误做出了贡献。
- andersonlucasg3 GitHub 为在应用项目中添加了对自定义本地化的Storyboard的重写功能。
- lswith GitHub 修复了 Cartfile 的循环引用问题。
- coybit GitHub 在 StringPickerPopover 中添加了 setImages() 功能。
- Mihael Isaev GitHub 从 barButtonItem 添加了 appear() 功能。
- iosMaher GitHub 提出了 setFont() 和 setFontColor() 的想法。
- gbuela GitHub 为所有Popover类型添加了 setValueChange(action:) API。
- ikbalyasar GitHub 为在 StringPickerPopover 上显示选中值的示例代码做出了贡献。
- weakfl GitHub 将其更新到 Swift 4.2。
- Tobisaninfo[GitHub](https://github.com/Tobisaninfo) 为与 Xcode 10.2 协同工作提供了对 cartage 的支持。
- AlexwingGitHub 将其更新到 Swift 5.0。