【问题标题】:Swift: Scroll View only when a TextField or Button is hidden by the KeyboardSwift:仅当键盘隐藏 TextField 或 Button 时滚动视图
【发布时间】: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 上更新了项目并修复了链接。谢谢

横向屏幕截图:

【问题讨论】:

    标签: swift ios8 scrollview uikeyboard


    【解决方案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】:

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

    【讨论】:

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