Анимация как клавиатура на 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
            )
        }
    }
}
Другие вопросы по тегам