Swift Scroll to UITextField 通过 UiscrollView 只在第一次出现错误

洛伦佐·冈萨雷斯

我在这里发布我的完整代码。问题是最初加载应用程序和视图控制器时。它完全有效。点击两个文本字段,滚动视图向上推,键盘位于当前文本字段下方。但是,如果敲出文本字段.. 向上移动视图并在文本字段上重新敲击它就不再这样做了。此外,如果通过导航控制器返回然后再次加载这个视图控制器,它不会做任何事情。它不再滚动..(不再向上推文本字段,键盘不再位于其下方)......

import UIKit
import Parse
import Alamofire
import SwiftyJSON

class VCreservacion: UIViewController,UITextFieldDelegate,UIScrollViewDelegate {

    var SUCURSALID = 0
    var EMP_NOMBRE = ""
    var DIRECCION = ""
    var PROVINCIA = ""
    var RESTID = 20556

    @IBOutlet var lbl_empresa: UILabel!
    @IBOutlet var lbl_direccion: UILabel!
    @IBOutlet var lbl_step: UILabel!
    @IBOutlet var cantidadView: UIView!
    @IBOutlet var datePicker: UIDatePicker!
    @IBOutlet var btn_reservar: UIButton!
    @IBOutlet var stackView: UIStackView!
    @IBOutlet var scrollView: UIScrollView!
    @IBOutlet var txtComentario: UITextField!
    @IBOutlet weak var txtCelular: UITextField!
    var activeField: UITextField?

    var steps = 2


    // MARK: RESERVE ACTION
    @IBAction func ReserveAction(_ sender: UIButton) {
        print("Reservando...")

        // For date formater
        var dateformated = ""
        var dateformated2 = ""
        let formatter = DateFormatter()
        formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
        //formatter.timeZone = NSTimeZone(forSecondsFromGMT: 0) as TimeZone!


        dateformated = formatter.string(from: datePicker.clampedDate)
        dateformated2 = formatter.string(from: datePicker.date)
        print(dateformated)
        print(dateformated2)
        let cart = Cart.sharedInstance

        guard let user = PFUser.current()  else {
            cart.showAlertView("Login", message: "Debes estar logeado para poder reservar.")
            return
        }

        Alamofire.request("URL String", parameters: ["qty": "\(steps)","sucursalid":"\(self.SUCURSALID)","restid":"\(RESTID)","comment":"\(txtComentario.text!)","phone":"\(txtCelular.text!)","datetime":"\(dateformated)","action":"request","userid":"\(user.objectId!)"]).authenticate(usingCredential: cart.credential).responseJSON() {

            response in

            if (response.error != nil ) {

                print(response.error.debugDescription)
                print(response.request)
                cart.showAlertView("Error", message: "there was an error.")

            }

            if(response.result.value != nil) {

                let json = JSON(response.result.value!);

                print(json);


                let success:Bool = json["success"].boolValue
                let error: Bool = json["error"].boolValue

                if(success) {
                    print("con exito")
                    let alert = UIAlertController(title: "Reserva Enviada", message: "Tu reserva ha sido enviada y será revisada por el establecimiento", preferredStyle: .alert)
                    let okAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.default) {
                        UIAlertAction in

                        // Get the previous Controller.
                        let targetController: UIViewController = (self.navigationController?.viewControllers[self.navigationController!.viewControllers.count - 3])!

                        // And go to that Controller
                        self.navigationController?.popToViewController(targetController, animated: true)

                    }

                    alert.addAction(okAction)
                    self.present(alert,animated:true)


                }
            }

        }



    }



    @IBAction func stepperValue(_ sender: UIStepper) {

        self.lbl_step.text = Int(sender.value).description
        steps = Int(sender.value)

    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        registerForKeyboardNotifications()
        self.scrollView.delegate = self
    }

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        deregisterFromKeyboardNotifications()
        self.scrollView.delegate = nil
    }


    // MARK: Viewdidload
    override func viewDidLoad() {
        super.viewDidLoad()
        // enable scroll on scrollview
         self.scrollView.isScrollEnabled = true

        // step label initial value 2
        self.lbl_step.text = "2"

        // Get celular or phone

        if ( Cart.sharedInstance.User_celular != "") {
            txtCelular.text = Cart.sharedInstance.User_celular
        } else {
            txtCelular.text = Cart.sharedInstance.User_phone
        }


        let nearesthour = Date().nearestHour()
        self.datePicker.minimumDate = nearesthour
        self.txtComentario.delegate = self
        self.txtCelular.delegate = self
        self.txtCelular.tag = 20
        self.scrollView.delegate = self


        // tap gesture recognizer

        let tap = UITapGestureRecognizer(target: self, action: #selector(handleTap(_:)))
        self.scrollView.addGestureRecognizer(tap)


        print("el enarest hour es \(nearesthour as Date?) y el date normal es \(Date())")

        self.btn_reservar.layer.cornerRadius = 10
        self.cantidadView.layer.cornerRadius = 10

        self.lbl_empresa.text = EMP_NOMBRE
        self.lbl_direccion.text = DIRECCION

        /*
        print("VC Reservacion")
        print("SUCURSAL \(SUCURSALID) ")
        print("EMP NOMBRE " + EMP_NOMBRE)
        print("DIRECCION " + DIRECCION)
        */


    }

    // MARK: TEXTFIELD STUFF

    func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
        self.activeField = textField
        return true
    }
    /*
    func textFieldDidBeginEditing(_ textField: UITextField) {
        self.activeField = textField
    }
    */


    func textFieldDidEndEditing(_ textField: UITextField) {

        activeField = nil

    }




    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

        print(" Keyboaard shown")


        var info = notification.userInfo!
        let keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue.size
        print(" el keyboardsize is \(keyboardSize)")
        let contentInsets : UIEdgeInsets = UIEdgeInsetsMake(0.0, 0.0, keyboardSize!.height + 80, 0.0)

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

        var aRect : CGRect = self.view.frame
        print("VIEW COMPLETE FRAME IS \(aRect)")
        print("KEYBOARD FRAME HEIGHT \(keyboardSize!.height)")
        aRect.size.height -= keyboardSize!.height
        print("FRAME MENOS KEYBOARD ES \(aRect)")

        print("SCROLLVIEW CONTENT \(self.scrollView.contentSize)")
        if let activeField = self.activeField {

            print("ACTIVEFIELD FRAME ORIGIN \(activeField.frame.origin) ")
            print("Active field is textfield tag is \(activeField.tag)")

            // if (!aRect.contains(activeField.frame.origin)){
            print("arect Does Not contains activeField")
            self.scrollView.scrollRectToVisible(activeField.frame, animated: true)
            print("TEXTFIELD FRAME ES \(activeField.frame)")
            print(" SCROLLVIEW CONTENT \(self.scrollView.contentSize)")
            //}
        }


    }

    @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.activeField = nil
        self.view.endEditing(true)
        self.scrollView.isScrollEnabled = false

    }


    @objc func handleTap(_ sender: UITapGestureRecognizer) {
        self.view.endEditing(true)
        print("Tap")

    }


    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        self.view.endEditing(true)
        return false
    }


    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        scrollView.contentSize = CGSize(width: view.frame.width, height: view.frame.height)
        print(" SCROLLVIEW CONTENT AFTER SUBVIEWS \(self.scrollView.contentSize)")
    }


    /*  // NOT WORKING BECAUSE OF UISCROLLVIEW IN PLACE, MUST USE UITAPGESTURE RECOGNIZER
     override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
     self.view.endEditing(true)
     self.activeField?.resignFirstResponder()
     }
     */


}
埃米尔

我有同样的问题。显然,获得键盘的大小有变化。我将UIKeyboardFrameBeginUserInfoKey更改UIKeyboardFrameEndUserInfoKey并让它再次工作。

这是我在按下文本字段时移动视图的确切代码

@objc func keyboardWasShown(notification: NSNotification){
    self.scrollView.isScrollEnabled = true
    var info = notification.userInfo!
    let keyboardSize = (info[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue.size
    let contentInsets = UIEdgeInsetsMake(0.0, 0.0, keyboardSize!.height, 0.0)

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Swift - UIScrollView scroll animation not working in viewDidLoad()

来自分类Dev

Firebase 存储下载在第一次运行中没有通过 swift

来自分类Dev

第一次通过成语

来自分类Dev

UIScrollview中的UITextField

来自分类Dev

以编程方式出现错误的UIView对于UIScrollView,可滚动内容的大小不明确。只有第一次

来自分类Dev

仅通过第一次出现的分隔符来分割字符串

来自分类Dev

通过第一次出现数字来分隔单元格

来自分类Dev

通过第一次出现的分隔符来分割字符串

来自分类Dev

如何通过在 JavaScript 中第一次出现字符 (:) 来拆分字符串

来自分类Dev

计算通过标准的连续值的第一次出现

来自分类Dev

UIScrollView - scroll or swipe?

来自分类Dev

iOS UIScrollView的默认contentOffset错误-Swift

来自分类Dev

只滚动一半内容UIScrollView Swift

来自分类Dev

UIScrollView中的UITableView在滚动后不响应第一次点击

来自分类Dev

选择UITextField时将UIScrollView向上移动

来自分类Dev

在UIScrollView中关闭UITextField小数键盘

来自分类Dev

无法将UITextField添加到UIScrollView

来自分类Dev

在UIScrollView中关闭UITextField小数键盘

来自分类Dev

UITextField不响应UIScrollView Xcode 7.3

来自分类Dev

如何使UITextField与Swift代码一起出现

来自分类Dev

嵌套的UIScrollView(在页面上具有pageingEnabled)在页面更改后未收到第一次底部滑动

来自分类Dev

如何使我在UIAlertController内的UITextField中输入的数据通过Swift中的重置保持不变?

来自分类Dev

如何通过swift将底线添加到子视图中的多个UITextField?

来自分类Dev

Swift-如何通过时间间隔将输入的信息保存在UITextfield中?

来自分类Dev

在 Swift4 上通过键盘隐藏时如何滚动 UITextField?

来自分类Dev

QString只替换第一次出现

来自分类Dev

只替换第一次出现的单词

来自分类Dev

Jquery如何只找到第一次出现

来自分类Dev

UITextField 委托“shouldChangeCharactersIn”不会在文本字段中的第一次输入时调用

Related 相关文章

  1. 1

    Swift - UIScrollView scroll animation not working in viewDidLoad()

  2. 2

    Firebase 存储下载在第一次运行中没有通过 swift

  3. 3

    第一次通过成语

  4. 4

    UIScrollview中的UITextField

  5. 5

    以编程方式出现错误的UIView对于UIScrollView,可滚动内容的大小不明确。只有第一次

  6. 6

    仅通过第一次出现的分隔符来分割字符串

  7. 7

    通过第一次出现数字来分隔单元格

  8. 8

    通过第一次出现的分隔符来分割字符串

  9. 9

    如何通过在 JavaScript 中第一次出现字符 (:) 来拆分字符串

  10. 10

    计算通过标准的连续值的第一次出现

  11. 11

    UIScrollView - scroll or swipe?

  12. 12

    iOS UIScrollView的默认contentOffset错误-Swift

  13. 13

    只滚动一半内容UIScrollView Swift

  14. 14

    UIScrollView中的UITableView在滚动后不响应第一次点击

  15. 15

    选择UITextField时将UIScrollView向上移动

  16. 16

    在UIScrollView中关闭UITextField小数键盘

  17. 17

    无法将UITextField添加到UIScrollView

  18. 18

    在UIScrollView中关闭UITextField小数键盘

  19. 19

    UITextField不响应UIScrollView Xcode 7.3

  20. 20

    如何使UITextField与Swift代码一起出现

  21. 21

    嵌套的UIScrollView(在页面上具有pageingEnabled)在页面更改后未收到第一次底部滑动

  22. 22

    如何使我在UIAlertController内的UITextField中输入的数据通过Swift中的重置保持不变?

  23. 23

    如何通过swift将底线添加到子视图中的多个UITextField?

  24. 24

    Swift-如何通过时间间隔将输入的信息保存在UITextfield中?

  25. 25

    在 Swift4 上通过键盘隐藏时如何滚动 UITextField?

  26. 26

    QString只替换第一次出现

  27. 27

    只替换第一次出现的单词

  28. 28

    Jquery如何只找到第一次出现

  29. 29

    UITextField 委托“shouldChangeCharactersIn”不会在文本字段中的第一次输入时调用

热门标签

归档