键盘出现多次时,滚动视图不会向上移动

Posted

技术标签:

【中文标题】键盘出现多次时,滚动视图不会向上移动【英文标题】:Scrollview doesn't move up when keyboard appears several times 【发布时间】:2017-11-24 06:59:35 【问题描述】:

我在viewDidLoad() 中创建了 30 个文本字段和var scrollview: UIScrollView,并且我试图在键盘覆盖文本字段时向上移动整个滚动视图。 Delegate 的文本字段和滚动视图已设置。 此代码(下方)有效,并且当键盘第一次出现时滚动视图向上移动,但问题是,当键盘第二次或更多次打开时,滚动视图不会向上移动。我无法解决这个问题几个小时的问题。任何人都可以检测到我的代码中的一些错误并给我正确的答案吗?我期待任何帮助!

我写的代码是这样的:

var activeField: UITextField?

func registerForKeyboardNotifications()
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWasShown(notificaiton:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillBeHidden(notification:)), name: NSNotification.Name.UIKeyboardWillHide, object: nil)


func deregisterForKeyboardNotifications()
    NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillShow, object: nil)
    NotificationCenter.default.removeObserver(self, name:NSNotification.Name.UIKeyboardWillHide, object: nil)


@objc func keyboardWasShown(notificaiton: NSNotification)
    var info = notificaiton.userInfo!
    let keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue.size
    let contentInsets: UIEdgeInsets = UIEdgeInsetsMake(0.0, 0.0, keyboardSize!.height, 0.0)
    var aRect: CGRect = view.frame
    aRect.size.height -= keyboardSize!.height

    if let activeField = activeField
        if !aRect.contains(activeField.frame.origin) == true
            scrollview.contentInset = contentInsets
        
    


@objc func keyboardWillBeHidden(notification: NSNotification)
    view.endEditing(true)


func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool
    activeField = textField
    registerForKeyboardNotifications()
    return true


func textFieldDidEndEditing(_ textField: UITextField)
    activeField = nil
    deregisterForKeyboardNotifications()

【问题讨论】:

不要在textFieldDidEndEditing 中调用deregisterForKeyboardNotifications,直到视图控制器消失 是的,我尝试在viewWillDisapprear 中编写这些代码,但键盘关闭时似乎没有调用此方法。 【参考方案1】:

朋友请试试这段代码。希望它也对你有用。我正在使用它,效果很好。

 override func viewDidLoad()
    NotificationCenter.default.addObserver(self,selector: #selector(self.keyboardDidShow(notification:)),
    name: UIResponder.keyboardDidShowNotification, object: nil)
    NotificationCenter.default.addObserver(self,selector: #selector(self.keyboardDidHide(notification:)),
    name: UIResponder.keyboardDidHideNotification, object: nil)


//MARK: Methods to manage keybaord
@objc func keyboardDidShow(notification: NSNotification) 
    var info = notification.userInfo
    let keyBoardSize = info![UIKeyboardFrameEndUserInfoKey] as! CGRect
    scrollView.contentInset = UIEdgeInsetsMake(0.0, 0.0, keyBoardSize.height, 0.0)
    scrollView.scrollIndicatorInsets = UIEdgeInsetsMake(0.0, 0.0, keyBoardSize.height, 0.0)


@objc func keyboardDidHide(notification: NSNotification) 
    
    scrollView.contentInset = UIEdgeInsets.zero
    scrollView.scrollIndicatorInsets = UIEdgeInsets.zero

我已经为 swift 4.0 编写了这段代码。

【讨论】:

谢谢,这段代码运行良好。非常感谢您的解决方案!我真的很想对此表示赞同,但很抱歉我没有达到足够的声誉。【参考方案2】:

管理多个文本字段滚动并在每个视图控制器中添加多行代码确实占用了大部分开发时间,但幸运的是,我们有一个代码数量较少的替代解决方案,请使用 libarary 您只需要在线添加您的didFinishLaunchingWithOptions

IQKeyboardManager.sharedManager().enable = true

这将处理您的整个项目键盘

希望对你有帮助

【讨论】:

感谢您的解决方案。实际上我是一个初学者,以至于我不知道如何使用库,所以这是我了解它的好机会。谢谢! (抱歉,我没有足够的声誉来支持您的解决方案) 如果你得到足够的解决方案,声誉就不是问题了:) IQKeyboardManager 不适用于滚动视图。【参考方案3】:

只需使用 IQKeyboardManager

首先安装 pod 在 AppDelegate.swift 中第二次导入 IQKeyboardManagerSwift 第三次写入IQKeyboardManager.shared.enable = true didFinishLaunchingWithOptions 函数。

@UIApplicationMain

class AppDelegate: UIResponder, UIApplicationDelegate 

var window: UIWindow?

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool 

  IQKeyboardManager.shared.enable = true

  return true

【讨论】:

以上是关于键盘出现多次时,滚动视图不会向上移动的主要内容,如果未能解决你的问题,请参考以下文章

向上推键盘 Swift iOS 后,我的 Scrollview 不会一直向上滚动

如何通过在焦点集中时将其移动到键盘顶部/视图中心来突出显示滚动视图中的焦点 UITextField

当新行添加到 UITextView 实例中时,如何向上滚动视图?

当表格视图向上滚动时,表格视图第一部分(第 0 部分)没有向上移动

如何在 UIView 中设置滚动视图以向上滑动被键盘隐藏的文本字段?

Swift:当键盘显示时向上滚动视图