ios - 使用 UIButton 实现 UIDatePicker 和 UIPickerView

标签 ios swift uibutton uipickerview uidatepicker

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

这是我的问题:我正在维护单独的约束和隐藏/显示方法,以对每个 View 进行动画输入和输出。这是很多重复代码,我觉得必须有一种更简洁的方法来做到这一点,因为它似乎是 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的屏幕截图...... Storyboard

最佳答案

你们,我找到了更好的方法!

我最初遗漏的是,当您从 super View 中删除 View 时,所有约束都会被删除。这使事情变得容易得多。

我为当前显示的 View 保留了 1 个约束类变量,因此 View 可以向下动画移动。

我还添加了一个“setup”函数来在 viewdidload() 上获取 View 。如果没有这个, View 在第一次出现时总是会从顶部开始动画(无法找到解决这个问题的方法)。

这是我使用的:

var secondaryMenuBottomConstraint: NSLayoutConstraint!

func setupSecondaryMenu(secondaryMenu: UIView){

    secondaryMenu.translatesAutoresizingMaskIntoConstraints = false

    let topConstraint = secondaryMenu.topAnchor.constraintEqualToAnchor(view.bottomAnchor)
    let leftConstraint = secondaryMenu.leftAnchor.constraintEqualToAnchor(view.leftAnchor)
    let rightConstraint = secondaryMenu.rightAnchor.constraintEqualToAnchor(view.rightAnchor)

    view.addSubview(secondaryMenu)
    NSLayoutConstraint.activateConstraints([topConstraint, leftConstraint, rightConstraint])
    self.view.layoutIfNeeded()
    secondaryMenu.removeFromSuperview()

}

func showSecondaryMenu(secondaryMenu: UIView){
    //Close any open keyboards
    amountTextField.resignFirstResponder()
    notesTextField.resignFirstResponder()

    //Add the view and then add constraints to show the submenu below the current view
    secondaryMenu.translatesAutoresizingMaskIntoConstraints = false
    let topConstraint = secondaryMenu.topAnchor.constraintEqualToAnchor(view.bottomAnchor)
    let leftConstraint = secondaryMenu.leftAnchor.constraintEqualToAnchor(view.leftAnchor)
    let rightConstraint = secondaryMenu.rightAnchor.constraintEqualToAnchor(view.rightAnchor)

    view.addSubview(secondaryMenu)
    NSLayoutConstraint.activateConstraints([topConstraint, leftConstraint, rightConstraint])

    secondaryMenuBottomConstraint = secondaryMenu.bottomAnchor.constraintEqualToAnchor(view.bottomAnchor)

    //animate the view up into place
    UIView.animateWithDuration(0.4, animations: {
        topConstraint.active = false
        self.secondaryMenuBottomConstraint.active = true
        self.view.layoutIfNeeded()
    })
}

func dismissSecondaryMenu(secondaryMenu: UIView){
    if secondaryMenu.superview != nil {
        secondaryMenu.translatesAutoresizingMaskIntoConstraints = false
        let secondaryMenuTopConstraint = secondaryMenu.topAnchor.constraintEqualToAnchor(view.bottomAnchor)
        self.secondaryMenuBottomConstraint.active = false

        UIView.animateWithDuration(0.4, animations: {
            secondaryMenuTopConstraint.active = true

            self.view.layoutIfNeeded()
        }, completion: {(finished:Bool) in
                secondaryMenu.removeFromSuperview()
        })
    }
}

关于ios - 使用 UIButton 实现 UIDatePicker 和 UIPickerView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36555150/

相关文章:

ios - ImagePicker Controller UIBarButtonItem 而不是 UIButton 的问题

ios - Watchkit:在动态行中包含两个模板的表格

ios - NSTimer() 可以不停地运行吗? (Xcode v 7.0.1, Swift 2.0)

ios - 如何使用 Swift 5 从 iOS13 中的后台应用程序获取事件应用程序的名称?

swift - Realm swift : Update all model objects and remove migration

iphone - 删除以编程方式创建的自定义按钮的边框

ios - Xcode 7 Swift 2 我应该使用按钮字体还是图像?

objective-c - NSFileManager fileExistsAtPath:isDirectory的用法

ios - 如何通过 Github API 上传图片以用于问题评论

swift - 使 UIImageview 旋转取决于另一个 UIImageview 旋转