SwiftyPickerPopover 6.6.6

SwiftyPickerPopover 6.6.6

测试已测试
语言语言 SwiftSwift
许可证 MIT
发布上次发布2019年10月
SPM支持 SPM

Yuta Hoshino 维护。



  • 作者:
  • Yuta Hoshino

SwiftyPickerPopover

这是在 iPhone/iPad 的 iOS9+ 上以简便方式显示内置选择器弹出窗口的一种更便捷的方法。

Version License Platform Carthage compatible

功能

  • 通过简单的代码,您可以在 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 ‘YourProjectTargetNamedo
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时,它将自动应用。

  1. 找到你想要更改的Popover的Storyboard的原始文件。例如,'CountdownPickerPopover.storyboard'。
  2. 将它添加到你的Xcode项目中以包括到 mainBundle 中。此时,请查看 'If needed, copy items'。不要更改文件名。
  3. 接下来,更改默认指定的模块。在Xcode中打开Storyboard文件,取消选中 InterfaceBuilder > Identity inspector > Custom Class 中的 'Inherit From Target'。将 'Module' 指定为 'SwiftyPickerPopover'。
  4. 最后,自定义你的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。

作者