使用UIButton实现UIDatePicker和UIPickerView

时间:2016-04-11 17:18:00

标签: ios swift uibutton uipickerview uidatepicker

我正在iOS应用中实现一个用户表单,该用户表单同时使用UIPickerViewUIDatePicker作为用户的输入设备。我已经将这些中的每个实现为场景中主UIViewController外部的视图,并通过添加和删除约束使用autolayout显示和隐藏它们。

这是我的问题:我正在维护单独的约束并隐藏/显示方法,以便为这些视图中的每一个进行动画制作。这是很多重复代码,我觉得必须有一个更简洁的方法来做到这一点,因为它似乎是iOS应用程序中非常常见的设计模式。我对此很新,所以我觉得我错过了什么。

对于将多个输入设备用于UIButtons,有没有比这更好的设计模式?

以下是我用来维护此代码的代码示例......

var datePickerViewBottomConstraint: NSLayoutConstraint!
var datePickerViewTopConstraint: NSLayoutConstraint!
var storagePickerViewBottomConstraint: NSLayoutConstraint!
var storagePickerViewTopConstraint: NSLayoutConstraint!

@IBAction func storageButtonClicked(sender: UITextField) {

    storagePickerView.translatesAutoresizingMaskIntoConstraints = false
    storagePickerViewBottomConstraint = storagePickerView.bottomAnchor.constraintEqualToAnchor(view.bottomAnchor)

    UIView.animateWithDuration(0.4, animations: {
        self.storagePickerViewTopConstraint.active = false
        self.storagePickerViewBottomConstraint.active = true
    self.view.layoutIfNeeded()
    })
}

@IBAction func datePumpedClicked(sender: UIButton) {

    datePickerView.translatesAutoresizingMaskIntoConstraints = false
    datePickerViewBottomConstraint = datePickerView.bottomAnchor.constraintEqualToAnchor(view.bottomAnchor)

    UIView.animateWithDuration(0.4, animations: {
        self.datePickerViewTopConstraint.active = false
        self.datePickerViewBottomConstraint.active = true
        self.view.layoutIfNeeded()
    })
}

@IBAction func datePickerDismiss(sender: AnyObject) {
    datePumpedLabel.setTitle(Global.dateFormatter.stringFromDate(datePicker.date), forState: UIControlState.Normal)

    datePickerView.translatesAutoresizingMaskIntoConstraints = false
    datePickerViewTopConstraint = datePickerView.topAnchor.constraintEqualToAnchor(view.bottomAnchor)

    UIView.animateWithDuration(0.4, animations: {
        self.datePickerViewBottomConstraint.active = false
        self.datePickerViewTopConstraint.active = true
        self.view.layoutIfNeeded()
    })  
}

@IBAction func storagePickerDismiss(sender: AnyObject) {

    storagePickerView.translatesAutoresizingMaskIntoConstraints = false
    storagePickerViewTopConstraint = storagePickerView.topAnchor.constraintEqualToAnchor(view.bottomAnchor)

    UIView.animateWithDuration(0.4, animations: {
        self.storagePickerViewBottomConstraint.active = false
        self.storagePickerViewTopConstraint.active = true
        self.view.layoutIfNeeded()
    })       
}

这是我的故事板的截图... Storyboard

1 个答案:

答案 0 :(得分:0)

你们,我想出了一个更好的方法!

我最初缺少的是当你从superview中删除视图时,所有的约束都被删除了。这使事情变得容易多了。

我为当前显示的视图保留了1个约束类变量,因此视图可以动画显示不合适的位置。

我还添加了“设置”功能,以便在rem != 0 && ....上获取视图。如果没有这个,视图将始终在第一次出现时从顶部开始动画(无法找到解决方法)。

以下是我使用的内容:

C11