Swift:仅当键盘隐藏 TextField 或 Button 时滚动视图

Posted

技术标签:

【中文标题】Swift:仅当键盘隐藏 TextField 或 Button 时滚动视图【英文标题】:Swift: Scroll View only when a TextField or Button is hidden by the Keyboard 【发布时间】:2015-08-18 04:04:53 【问题描述】:

下面是我尝试使用的代码,仅当键盘隐藏焦点文本字段或 UIButton 时,视图才会滚动:

import UIKit

class ViewController: UIViewController, UITextFieldDelegate 

    @IBOutlet weak var buttonToBottomConstraint: NSLayoutConstraint!

    @IBOutlet weak var textFieldUsername: UITextField!
    @IBOutlet weak var textFieldPassword: UITextField!
    @IBOutlet weak var scrollView: UIScrollView!


    override func viewDidLoad() 
        super.viewDidLoad()

        NSNotificationCenter.defaultCenter().addObserver(self, selector:"keyboardWillBeHidden:", name: UIKeyboardWillHideNotification, object: nil)

        NSNotificationCenter.defaultCenter().addObserver(self, selector:"keyboardWillBeShown:", name: UIKeyboardWillShowNotification, object: nil)
    

    func textFieldDidBeginEditing(textField: UITextField) 
    

    func textFieldShouldReturn(textField: UITextField) -> Bool textField.resignFirstResponder()

        return true
    

    func keyboardWillBeHidden(notification: NSNotification)

        self.scrollView.setContentOffset(CGPointMake(0, 0), animated: true)
    

    func keyboardWillBeShown(notification: NSNotification)

        let userInfo = notification.userInfo!

        if let kbsize = userInfo[UIKeyboardFrameBeginUserInfoKey]?.CGRectValue().size

             self.scrollView .setContentOffset(CGPointMake(0, kbsize.or), animated: true)
        
    

问题:即使键盘没有隐藏任何内容,视图也会滚动。

在发布时查看:

点击文本字段时查看:

问题:我如何检查焦点区域是否被键盘隐藏,如果是,则将其推到它上方?

项目:TextFieldScroll

编辑

应用在纵向模式下运行良好,但在横向模式下却不行。同样在横向模式下,当用户名文本字段键盘打开并点击密码文本字段时,它仍然隐藏在键盘后面。我在 Github 上更新了项目并修复了链接。谢谢

横向屏幕截图:

【问题讨论】:

【参考方案1】:
var currentTextField:UITextField?

@IBOutlet weak var textFieldUsername: UITextField!
@IBOutlet weak var textFieldPassword: UITextField!
@IBOutlet weak var scrollView: UIScrollView!


override func viewDidLoad() 

    super.viewDidLoad()

    NSNotificationCenter.defaultCenter().addObserver(self, selector:"keyboardWillBeHidden:", name: UIKeyboardWillHideNotification, object: nil)

    NSNotificationCenter.defaultCenter().addObserver(self, selector:"keyboardWillBeShown:", name: UIKeyboardWillShowNotification, object: nil)


func textFieldDidBeginEditing(textField: UITextField)

currentTextField=textField;


func textFieldShouldReturn(textField: UITextField) -> Bool 
textField.resignFirstResponder()

    return true


func keyboardWillBeHidden(notification: NSNotification)
      currentTextField=nil;
    self.scrollView.setContentOffset(CGPointMake(0, 0), animated: true)


func keyboardWillBeShown(notification: NSNotification)

    let userInfo = notification.userInfo!

    if let kbsize = userInfo[UIKeyboardFrameBeginUserInfoKey]?.CGRectValue().size
    
          let contentInsets = UIEdgeInsets(top: 0, left: 0, bottom: kbsize.height, right: 0)
        let screenSize: CGRect = UIScreen.mainScreen().bounds
       let screenHeight = screenSize.height
        let height:CGFloat=screenHeight-(kbsize.height)-(currentTextField!.frame.size.width)

         if(currentTextField!.frame.origin.y>=height )
        
            var scrollPoint: CGPoint  = CGPointMake(0.0, currentTextField!.frame.origin.y - (kbsize.height));
            self.scrollView .setContentOffset(scrollPoint, animated: true)
        

    


  func textFieldDidEndEditing(textField: UITextField) 
     currentTextField=nil;
   

【讨论】:

谢谢。我会在早上试试这个,然后告诉你。 嘿,我在横向模式下仍然遇到问题。我更新了问题。不过我确实取得了进展,谢谢。【参考方案2】:

我没有看到你设置scrollViewcontentSize。因此,scrollView 会随着键盘滚动,因为它使用屏幕的大小。

【讨论】:

内容大小应该是多少?或者我应该在哪里设置? 当您使用UIScrollView 时,您需要告诉它您的内容有多大。您应该设置它的contentSize 以尽快告诉它(例如viewDidLoaddidSet)。你需要传入一个CGSize,它接受宽度和高度。宽度将是视图控制器的宽度,高度将是徽标的高度+标签+文本字段+按钮+中间的空间。 谢谢。当我在 viewDidLoad 中添加内容大小时,什么也没有发生 我添加了下面这行self.scrollView.contentSize = CGSize(width: self.view.frame.width, height: CGFloat(400)),结果和第二张图一样。 另外,我用IB添加了scrollView,它覆盖了整个屏幕。

以上是关于Swift:仅当键盘隐藏 TextField 或 Button 时滚动视图的主要内容,如果未能解决你的问题,请参考以下文章

使用自定义 uitableViewCell 按下回车键或单击 uitableView 时隐藏键盘

Swift编码总结2

SwiftUI实现Textfield输入键盘自动隐藏

swift 点击Textfield 后自动上移,避免键盘被遮住

返回键 隐藏收起键盘textView|textField

键盘在 PageView 中隐藏 TextField