【问题标题】:Prevent View From Sliding When Keyboard Switches To Date Picker当键盘切换到日期选择器时防止视图滑动
【发布时间】:2015-02-22 18:54:54
【问题描述】:

在我的应用中,我有一个包含三个文本字段的 UIView:

名字、姓氏、出生日期。

姓名字段并排在一个“行”上,出生日期字段在其下方的“行”上。

当键盘打开或关闭时,视图控制器会向上或向下滑动以确保字段不会被覆盖。我可以从名字切换到姓氏,而无需额外滑动,因为它们键盘保持打开状态。但是,出生日期设置为显示 UIDatePicker 而不是键盘。当用户从任一名称字段移动到日期字段时,键盘切换到日期选择器,但不执行“keyboardWillHide”功能。然而,它将为新的日期选择器执行“keyboardWillShow”功能,从而再次向上滑动视图控制器。

由于这个问题,页面顶部的任何内容都将滚动到视图之外,无法恢复,除非重新启动应用程序,或在 viewWillAppear/Disappear 上重置 VC 的原始坐标。

这是我的代码在滑动时的样子:

    func keyboardWillShow(notification: NSNotification) {
        if let userInfo = notification.userInfo {
            if let keyboardSize =  (userInfo[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue() {
                kbHeight = keyboardSize.height
                self.animateTextField(true)
            }
        }
    }

    func keyboardWillHide(notification: NSNotification) {
        self.animateTextField(false)
    }

    func animateTextField(up: Bool) {
            var movementDistance = 80
            var movementDuration = 0.3
            var movement = CGFloat(up ? -movementDistance : movementDistance)
            UIView.beginAnimations("anim", context: nil)
            UIView.setAnimationBeginsFromCurrentState(true)
            UIView.setAnimationDuration(movementDuration)
            self.view.frame = CGRectOffset(self.view.frame, 0, movement)
            UIView.commitAnimations()
    }

【问题讨论】:

    标签: ios swift uidatepicker uikeyboard


    【解决方案1】:

    我最终创建了一个跟踪变量来判断键盘何时打开和关闭。这样滑动函数只有在满足条件时才会执行。

    我的动画功能的新代码是:

        func animateTextField(up: Bool) {
            if(up) {
                if(!keyboardIsOpen) {
                    var movementDistance = -80
                    var movementDuration = 0.3
                    var movement = CGFloat(movementDistance)
                    UIView.beginAnimations("anim", context: nil)
                    UIView.setAnimationBeginsFromCurrentState(true)
                    UIView.setAnimationDuration(movementDuration)
                    self.view.frame = CGRectOffset(self.view.frame, 0, movement)
                    UIView.commitAnimations()
                    keyboardIsOpen = true
                }
            }
            else {
                if(keyboardIsOpen) {
                    var movementDistance = 80
                    var movementDuration = 0.3
                    var movement = CGFloat(movementDistance)
                    UIView.beginAnimations("anim", context: nil)
                    UIView.setAnimationBeginsFromCurrentState(true)
                    UIView.setAnimationDuration(movementDuration)
                    self.view.frame = CGRectOffset(self.view.frame, 0, movement)
                    UIView.commitAnimations()
                    keyboardIsOpen = false
                }
            }
        }
    

    简单。

    【讨论】:

      猜你喜欢
      • 2017-05-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-14
      • 2015-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      相关资源
      最近更新 更多