Анимация как клавиатура на DatePicker появляется с быстрым IOS
Я хочу, чтобы на анимации появлялось средство выбора даты, как на клавиатуре. Есть способ достичь этого?
Пока это мой код, но я получаю только контейнерное представление (то, которое имитирует тень) для создания странной анимации.
@IBAction func ShowPicker(sender: AnyObject) {
let ContainerHeight = CGFloat(264) //320, 216
let PickerHeight = CGFloat()
//container for datepicker and simulates a shadow
shadowView = UIView()
//Use with transitionWithView
//shadowView.frame = CGRectMake(0, 0, self.view.frame.width, self.view.frame.height)
//Use with animateWithDuration
shadowView.backgroundColor = UIColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 0.5)
let tap = UITapGestureRecognizer(target: self, action: #selector(touchOutSide))
shadowView.addGestureRecognizer(tap)
let datePicker : UIDatePicker = UIDatePicker()
let datePickerContainer = UIView()
//datePickerContainer.frame = CGRectMake(0.0, self.view.frame.width, self.view.frame.width, 320.0)
datePickerContainer.frame = CGRectMake(0.0, self.view.frame.height - ContainerHeight, self.view.frame.width, ContainerHeight)
//Nota ese 320 debe ser la altura natural del picker mas la altura de los botones
datePickerContainer.backgroundColor = UIColor.whiteColor()
let pickerSize : CGSize = datePicker.sizeThatFits(CGSizeZero)
//datePicker.frame = CGRectMake(0.0, 0.0, self.view.frame.width, 216.0)
datePicker.frame = CGRectMake(0.0, 0.0, self.view.frame.width, ContainerHeight)
//datePicker.clipsToBounds = true
datePicker.setDate(NSDate(), animated: true)
datePicker.maximumDate = NSDate()
//datePicker.backgroundColor = UIColor(red: 0.0, green: 0.0, blue: 1.0, alpha: 0.5)
datePicker.datePickerMode = UIDatePickerMode.DateAndTime
datePicker.addTarget(self, action: "dateChangedInDate:", forControlEvents: UIControlEvents.ValueChanged)
//datePickerContainer.addSubview(datePicker)
let pickerHolder = UIView()
pickerHolder.frame = CGRectMake(0.0, 20, self.view.frame.width, ContainerHeight)
pickerHolder.addSubview(datePicker)
datePickerContainer.addSubview(pickerHolder)
let doneButton = UIButton()
doneButton.setTitle("Ok", forState: UIControlState.Normal)
doneButton.setTitleColor(UIColor.whiteColor(), forState: UIControlState.Normal)
doneButton.backgroundColor = UIColor.lightGrayColor()
doneButton.addTarget(self, action: Selector("dismissPicker:"), forControlEvents: UIControlEvents.TouchUpInside)
doneButton.frame = CGRectMake(self.view.frame.width/2, 0.0, self.view.frame.width/2, 37.0)
let btnCancel = UIButton()
btnCancel.setTitle("Cancel", forState: UIControlState.Normal)
btnCancel.setTitleColor(UIColor.whiteColor(), forState: UIControlState.Normal)
btnCancel.backgroundColor = UIColor.lightGrayColor()
btnCancel.addTarget(self, action: Selector("cancelTap"), forControlEvents: UIControlEvents.TouchUpInside)
btnCancel.frame = CGRectMake(0.0, 0.0, self.view.frame.width/2, 37.0)
datePickerContainer.addSubview(doneButton)
datePickerContainer.addSubview(btnCancel)
shadowView.addSubview(datePickerContainer)
// Makes weird animations:
//UIView.transitionWithView(self.view, duration: 0.9, options: UIViewAnimationOptions.TransitionCrossDissolve, animations: {self.view.addSubview(self.shadowView)}, completion: nil)
self.view.addSubview(shadowView)
UIView.animateWithDuration(2, animations: {() -> Void in self.shadowView.frame = CGRect(x: 0.0, y: 0.0, width: self.view.frame.width, height: ContainerHeight)})
}
1 ответ
Поскольку ваша функция обозначена с помощью IBOutlet, я подозреваю, что вы используете Interface Builder (IB). Я бы подумал о том, чтобы создать свой инструмент выбора даты, контейнер и кнопки с IB, чтобы вы могли их стилизовать. Жизненный цикл вашего средства выбора даты и связанных представлений в настоящее время ограничен функцией ShowPicker, но вы хотите, чтобы они сохранялись за пределами этой функции, обычно они существуют в вашем контроллере представления или в одном из его подпредставлений. Вот пример кода, который вы можете начать и украсить своей спецификой.
import UIKit
class ViewController: UIViewController {
var button: UIButton!
let datePicker = UIDatePicker()
var isDatePickerShowing = false
override func viewDidLoad() {
super.viewDidLoad()
button = UIButton(type: .system)
button.setTitle("Toggle Date Picker", for: .normal)
button.frame = CGRect(x: 10, y: 60, width: 200, height: 32)
button.addTarget(self, action:#selector (self.tapped), for: .touchUpInside)
view.addSubview(button)
let dpSize = datePicker.bounds.size
let size = view.bounds.size
datePicker.frame = CGRect(
x: (size.width - dpSize.width) / 2.0,
y: size.height,
width: dpSize.width,
height: dpSize.height
)
view.addSubview(datePicker)
}
func tapped(sender: AnyObject) {
let dpSize = datePicker.bounds.size
let size = view.bounds.size
let y = isDatePickerShowing ? size.height : size.height - dpSize.height
isDatePickerShowing = !isDatePickerShowing
UIView.animate(withDuration: 0.75) {
self.datePicker.frame = CGRect(
x: (size.width - dpSize.width) / 2.0,
y: y,
width: dpSize.width,
height: dpSize.height
)
}
}
}