【问题标题】:move UITextField up when keyboard present键盘存在时向上移动 UITextField
【发布时间】:2017-11-13 14:30:44
【问题描述】:

我最近开始按照互联网上的说明开发自己的应用程序。我只是一个初学者(没有编码知识),因此可能会犯我无法理解的非常愚蠢的错误。

在我的应用程序中,每当我尝试输入电子邮件地址时,我的电子邮件文本字段都会隐藏在键盘后面。我做了一些研究(关于堆栈溢出)并编写了一段代码,假设将我的文本字段向上移动,但事实并非如此......我相信代码的整体结构是正确的(虽然我在这里可能是错的)但它可能是只是使我的代码无效的小错误。

谁能指导我在这里做错了什么?

下面是我写的一段代码: {

import UIKit
import WebKit
import CoreGraphics
import AVFoundation
import QuartzCore
import Foundation

class StudentSignUpViewController: UIViewController,UIScrollViewDelegate, UITextFieldDelegate {


@IBOutlet weak var yourEmail: UITextField!
@IBOutlet weak var scrollView: UIScrollView!

override func viewDidLoad() {
    super.viewDidLoad()

    //setting portrait
    AppUtility.lockOrientation(.portrait)

    //hide keyboard when click outside
    self.hideKeyboardWhenTappedAround()

    //hide keyboard when click on return
    self.yourEmail.delegate = self        
    self.scrollView.delegate = self


    //boarder line for yourEmail
    yourEmail.frame.size.height =  UIScreen.main.fixedCoordinateSpace.bounds.size.width * CGFloat(0.05)
    yourEmail.font = UIFont.italicSystemFont(ofSize: UIScreen.main.fixedCoordinateSpace.bounds.size.width * CGFloat(0.04))
    bottomBoader(BottomLine: "UrEmailTextBottomLine", length: 1.0, yourTextBox: yourEmail)
    yourEmail.applyCustomClearButton(yourTextBox: yourEmail)


    registerForKeyboardNotifications()
    deregisterFromKeyboardNotifications()

}


override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    AppUtility.lockOrientation(.portrait)
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)

    AppUtility.lockOrientation(.all)
}


// ***************************************************  moving textfiles when keyborad present ***********************************************************


func registerForKeyboardNotifications(){
    //Adding notifies on keyboard appearing
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWasShown(notification:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillBeHidden(notification:)), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
}

func deregisterFromKeyboardNotifications(){
    //Removing notifies on keyboard appearing
    NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillShow, object: nil)
    NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillHide, object: nil)
}

@objc func keyboardWasShown(notification: NSNotification){
    //Need to calculate keyboard exact size due to Apple suggestions
    self.scrollView.isScrollEnabled = true
    var info = notification.userInfo!
    let keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue.size
    let contentInsets : UIEdgeInsets = UIEdgeInsetsMake(0.0, 0.0, keyboardSize!.height, 0.0)

    self.scrollView.contentInset = contentInsets
    self.scrollView.scrollIndicatorInsets = contentInsets

    var aRect : CGRect = self.view.frame
    aRect.size.height -= keyboardSize!.height
    if let activeField = self.yourEmail {
        if (!aRect.contains(activeField.frame.origin)){
            self.scrollView.scrollRectToVisible(activeField.frame, animated: true)
        }
    }
}

@objc func keyboardWillBeHidden(notification: NSNotification){
    //Once keyboard disappears, restore original positions
    var info = notification.userInfo!
    let keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue.size
    let contentInsets : UIEdgeInsets = UIEdgeInsetsMake(0.0, 0.0, -keyboardSize!.height, 0.0)
    self.scrollView.contentInset = contentInsets
    self.scrollView.scrollIndicatorInsets = contentInsets
    self.view.endEditing(true)
    self.scrollView.isScrollEnabled = false
    //self.scrollView.contentInset = UIEdgeInsets.zero
}

func textFieldDidBeginEditing( textField: UITextField){
    yourEmail = textField
}

func textFieldDidEndEditing(textField: UITextField){
    yourEmail = nil
}

【问题讨论】:

    标签: swift uiscrollview uitextfield nsnotificationcenter uikeyboard


    【解决方案1】:

    问题是你是registerForKeyboardNotifications(),然后是deregisterFromKeyboardNotifications(),所以你没有收到键盘通知。你应该把注销移到deinit

    deinit {
        deregisterFromKeyboardNotifications()
    }
    

    编辑

    正如@matt 指出的那样,您不需要deregisterFromKeyboardNotifications,所以只需删除该代码(包括我对deinit 的建议)

    【讨论】:

    • 其实根本不需要注销。不再因未注销而受到任何处罚;这种担忧几年前就消失了。
    • 嗨,我尝试在从代码中删除 deregisterFromKeyboardNotifications() 后运行代码,但没有运气.. 我所做的是从整个代码中删除以下代码:{ func deregisterFromKeyboardNotifications(){ //删除键盘上出现的通知 NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillShow, object: nil) NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillHide, object: nil) } }
    【解决方案2】:

    将您的控件嵌入到带有故事板上静态单元格的 UITableView 将让系统为您处理滚动。

    【讨论】:

      【解决方案3】:

      嘿兄弟,为什么在 viewDidLoad 中调用这两个函数

      registerForKeyboardNotifications()
      deregisterFromKeyboardNotifications()
      

      在 viewDidLoad 中仅调用 registerForKeyboardNotifications(),在 deinit 中调用 deregisterFromKeyboardNotifications()

      【讨论】:

        【解决方案4】:

        工作正常的最终解决方案,我从堆栈溢出中复制了它并为我的目的稍微调整了它:

         var activeField: UITextField?
        
        func registerForKeyboardNotifications(){
            //Adding notifies on keyboard appearing
            NotificationCenter.default.addObserver(self, selector: #selector(keyboardWasShown(notification:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
            NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillBeHidden(notification:)), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
        }
        
        @objc func keyboardWasShown(notification: NSNotification){
            //Need to calculate keyboard exact size due to Apple suggestions
            self.scrollView.isScrollEnabled = true
            var info = notification.userInfo!
            let keyboardSize = (info[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue.size
            let contentInsets : UIEdgeInsets = UIEdgeInsetsMake(0.0, 0.0, keyboardSize!.height, 0.0)
        
            self.scrollView.contentInset = contentInsets
            self.scrollView.scrollIndicatorInsets = contentInsets
        
            var aRect : CGRect = self.view.frame
            aRect.size.height -= keyboardSize!.height
        
            if let activeField = self.activeField {
                if activeField.frame.maxY > (scrollView.frame.height - keyboardSize!.height){
                     self.scrollView.setContentOffset(CGPoint.init(x: 0, y: activeField.frame.maxY - (scrollView.frame.height - keyboardSize!.height) + 20), animated: true)
                } else {
                    return
                            }
        
            print(activeField.frame.maxY)
            print(scrollView.frame.height)
            print(keyboardSize!.height)
            print(scrollView.frame.height - keyboardSize!.height)
            print(activeField.frame.maxY - (scrollView.frame.height - keyboardSize!.height) + 20)
            }
        }
        
        @objc func keyboardWillBeHidden(notification: NSNotification){
            //Once keyboard disappears, restore original positions
            var info = notification.userInfo!
            let keyboardSize = (info[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue.size
            let contentInsets : UIEdgeInsets = UIEdgeInsetsMake(0.0, 0.0, -keyboardSize!.height, 0.0)
            self.scrollView.contentInset = contentInsets
            self.scrollView.scrollIndicatorInsets = contentInsets
            self.view.endEditing(true)
            self.scrollView.isScrollEnabled = false
        }
        
        func textFieldDidBeginEditing(_ textField: UITextField){
            activeField = textField
        }
        
        func textFieldDidEndEditing(_ textField: UITextField){
            activeField = nil
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-10
          • 2021-11-30
          • 2019-04-04
          • 2012-10-10
          相关资源
          最近更新 更多