├── .gitignore ├── LICENSE.txt ├── Package.swift ├── README.md ├── Sources ├── PopOverDatePickerViewController.swift └── Storyboards │ └── PopOverDatePicker.storyboard └── renovate.json /.gitignore: -------------------------------------------------------------------------------- 1 | # Mac OS X 2 | .DS_Store 3 | 4 | # Xcode 5 | build/ 6 | *.pbxuser 7 | !default.pbxuser 8 | *.mode1v3 9 | !default.mode1v3 10 | *.mode2v3 11 | !default.mode2v3 12 | *.perspectivev3 13 | !default.perspectivev3 14 | xcuserdata 15 | *.xccheckout 16 | *.moved-aside 17 | DerivedData 18 | *.hmap 19 | *.ipa 20 | *.xcuserstate 21 | 22 | # Carthage 23 | Carthage/Build 24 | Sample/Podfile.lock 25 | Sample/Pods/* 26 | 27 | Sample/Sample.xcworkspace/contents.xcworkspacedata 28 | 29 | SampleObjectiveC/Podfile.lock 30 | SampleObjectiveC/Pods/* 31 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) 2017 - 2017 Takuya Ichise 2 | Permission is hereby granted, free of charge, to any person obtaining a copy 3 | of this software and associated documentation files (the "Software"), to deal 4 | in the Software without restriction, including without limitation the rights 5 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 6 | copies of the Software, and to permit persons to whom the Software is 7 | furnished to do so, subject to the following conditions: 8 | 9 | The above copyright notice and this permission notice shall be included in 10 | all copies or substantial portions of the Software. 11 | 12 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 13 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 14 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 15 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 16 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 17 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 18 | THE SOFTWARE. 19 | -------------------------------------------------------------------------------- /Package.swift: -------------------------------------------------------------------------------- 1 | // swift-tools-version:5.10 2 | import PackageDescription 3 | 4 | let package = Package( 5 | name: "PopOverDatePicker", 6 | platforms: [ 7 | .iOS(.v13), 8 | .macOS(.v10_15) 9 | ], 10 | products: [ 11 | .library( 12 | name: "PopOverDatePicker", 13 | targets: ["PopOverDatePicker"]), 14 | ], 15 | dependencies: [ 16 | ], 17 | targets: [ 18 | .target( 19 | name: "PopOverDatePicker", 20 | dependencies: [], 21 | path: "Sources" 22 | ), 23 | .testTarget( 24 | name: "PopOverDatePickerTests", 25 | dependencies: ["PopOverDatePicker"]), 26 | ] 27 | ) 28 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ### PopOverDatePicker ![CocoaPods Version](https://img.shields.io/cocoapods/v/PopOverDatePicker.svg?style=flat) ![Platform](https://img.shields.io/cocoapods/p/PopOverDatePicker.svg?style=flat) ![License](https://img.shields.io/cocoapods/l/PopOverDatePicker.svg?style=flat) 2 | 3 | PopOverDatePicker is a PopOver style DatePicker view. 4 | 5 | ### Image 6 | 7 | #### iPhone 8 | ![image](https://user-images.githubusercontent.com/43707/63687725-4d308b80-c840-11e9-8e8b-4c6e07db38a6.png) 9 | 10 | ### Examples 11 | 12 | #### for Swift 13 | ``` 14 | let calendar = Calendar.current 15 | let date = Date() 16 | guard let yesterday = calendar.date(byAdding: .day, value: -1, to: calendar.startOfDay(for: date)) else { 17 | fatalError() 18 | } 19 | 20 | guard let tomorrow = calendar.date(byAdding: .day, value: +1, to: calendar.startOfDay(for: date)) else { 21 | fatalError() 22 | } 23 | 24 | let popOverDatePickerViewController = PopOverDatePickerViewController.instantiate() 25 | popOverDatePickerViewController.set(date: date) 26 | popOverDatePickerViewController.set(minimumDate: yesterday) 27 | popOverDatePickerViewController.set(maximumDate: tomorrow) 28 | popOverDatePickerViewController.set(datePickerMode: .date) 29 | popOverDatePickerViewController.set(locale: Locale(identifier: "ja-JP")) 30 | popOverDatePickerViewController.popoverPresentationController?.barButtonItem = sender 31 | popOverDatePickerViewController.presentationController?.delegate = self 32 | popOverDatePickerViewController.changeHandler = { (date: Date) -> Void in 33 | print(date) 34 | } 35 | present(popOverDatePickerViewController, animated: true, completion: nil) 36 | ``` 37 | 38 | ### Installation (CocoaPods) 39 | `pod PopOverDatePicker` 40 | 41 | ### CocoaPods URL 42 | - [PopOverDatePicker on CocoaPods.org](https://cocoapods.org/pods/PopOverDatePicker) 43 | 44 | ### License 45 | PopOverDatePicker is available under the MIT license. See the LICENSE file for more info. 46 | -------------------------------------------------------------------------------- /Sources/PopOverDatePickerViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PopOverDatePickerViewController 3 | // 4 | 5 | import UIKit 6 | 7 | open class PopOverDatePickerViewController: UIViewController, UIAdaptivePresentationControllerDelegate { 8 | 9 | var datePicker = UIDatePicker() 10 | 11 | @objc open var changeHandler: ((_ date: Date) -> Void)? 12 | 13 | @objc public static func instantiate() -> PopOverDatePickerViewController { 14 | let storyboardsBundle = getStoryboardsBundle() 15 | 16 | let storyboard = UIStoryboard(name: "PopOverDatePicker", bundle: storyboardsBundle) 17 | 18 | guard let popOverDatePickerViewController = storyboard.instantiateViewController(withIdentifier: "PopOverDatePickerViewController") as? PopOverDatePickerViewController else { 19 | fatalError() 20 | } 21 | 22 | popOverDatePickerViewController.modalPresentationStyle = UIModalPresentationStyle.popover 23 | popOverDatePickerViewController.popoverPresentationController?.permittedArrowDirections = UIPopoverArrowDirection.up 24 | popOverDatePickerViewController.popoverPresentationController?.backgroundColor = UIColor.white 25 | 26 | return popOverDatePickerViewController 27 | } 28 | 29 | override open func viewDidLoad() { 30 | super.viewDidLoad() 31 | 32 | // The default UI of UIDatePicker is different on iOS14 and above, so I describe this. 33 | if #available(iOS 13.4, *) { 34 | self.datePicker.preferredDatePickerStyle = .wheels 35 | } 36 | 37 | self.datePicker.addTarget(self, action: #selector(changeDate), for: .valueChanged) 38 | 39 | self.preferredContentSize = CGSize(width: 320, height:162) 40 | 41 | view.addSubview(datePicker) 42 | } 43 | 44 | override open func viewWillAppear(_ animated: Bool) { 45 | super.viewWillAppear(animated) 46 | } 47 | 48 | override open func viewWillLayoutSubviews() { 49 | super.viewWillLayoutSubviews() 50 | } 51 | 52 | override open func didReceiveMemoryWarning() { 53 | super.didReceiveMemoryWarning() 54 | } 55 | 56 | @objc open func set(date: Date) { 57 | self.datePicker.date = date 58 | } 59 | 60 | @objc open func set(datePickerMode: UIDatePicker.Mode) { 61 | self.datePicker.datePickerMode = datePickerMode 62 | } 63 | 64 | @objc open func set(locale: Locale) { 65 | self.datePicker.locale = locale 66 | } 67 | 68 | @objc open func set(minimumDate: Date) { 69 | self.datePicker.minimumDate = minimumDate 70 | } 71 | 72 | @objc open func set(maximumDate: Date) { 73 | self.datePicker.maximumDate = maximumDate 74 | } 75 | 76 | static func getStoryboardsBundle() -> Bundle? { 77 | let podBundle = Bundle(for: PopOverDatePickerViewController.self) 78 | 79 | #if SWIFT_PACKAGE 80 | let bundleURL = podBundle.url(forResource: "PopOverDatePicker_PopOverDatePicker", withExtension: "bundle") 81 | #else 82 | let bundleURL = podBundle.url(forResource: "PopOverDatePickerStoryboards", withExtension: "bundle") 83 | #endif 84 | let bundle = Bundle(url: bundleURL!)! 85 | 86 | return bundle 87 | } 88 | 89 | @objc func changeDate() { 90 | let date = self.datePicker.date 91 | 92 | if let changeHandler = self.changeHandler { 93 | changeHandler(date) 94 | } 95 | } 96 | } 97 | -------------------------------------------------------------------------------- /Sources/Storyboards/PopOverDatePicker.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://docs.renovatebot.com/renovate-schema.json", 3 | "extends": [ 4 | "config:base" 5 | ] 6 | } 7 | --------------------------------------------------------------------------------