UITextField:开始输入时,textfield向上弹起,然后向下弹起 [英] UITextField: When beginning input, textfield bounces up, and then bounces down

查看:31
本文介绍了UITextField:开始输入时,textfield向上弹起,然后向下弹起的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我也用 UITextView 看到过这个.显然,我缺少一些非常基本的东西.

I've seen this with UITextView too. Clearly, I'm missing something pretty basic.

我试过:- 将文本大小设置为小- UITextField:设置 1 行,不调整大小- 移除移动文本域的能力

I've tried: - Setting textsize to small - UITextField: Setting 1 line, no resize - Removing the ability to move the texfield

import UIKit

class XViewController: UIViewController, UITextFieldDelegate, UIGestureRecognizerDelegate {

    // UI elements
    let cancelButton = UIButton()
    let okButton = UIButton()
    var image:UIImage?
    var previewImageView:UIImageView = UIImageView()
    let textField = UITextField()
    let tapGestureRecognizer = UITapGestureRecognizer()
    let textFieldTypingPositionY:CGFloat = 200
    var textFieldActualPositionY:CGFloat!
    let textFieldHeight:CGFloat = 40

    var draggingTextField:Bool = false

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        setupTextField()
    }

    func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString text: String) -> Bool {
        let textFieldSize = textField.text!.characters.count
        let textSize = text.characters.count
        if text == "\n" && textFieldSize == 0 {
            // press return on empty textfield
            textField.text = ""
            hideTextField()
            return true
        } else if textFieldSize == 1 && text == "" {
            // backspace to empty
            textField.text = ""
            hideTextField()
            return true
        } else if text == "\n"  {
            textField.resignFirstResponder()
        } else if (textFieldSize + textSize) > 30 {
            let diff = (textFieldSize - textSize) - 30
            textField.text = (text as NSString).substringToIndex(diff - 1)
        }
        return true
    }

    func setupTextField() {
        // TextView
        textField.translatesAutoresizingMaskIntoConstraints = false
        textField.backgroundColor = UIColor.blackColor().colorWithAlphaComponent(0.7)
        textField.textColor = UIColor.whiteColor()
        textField.font = UIFont.systemFontOfSize(14.0)
        textField.textAlignment = NSTextAlignment.Center
        textField.text = ""
        textField.hidden = true
        textField.delegate = self
        self.view.addSubview(textField);

        // Text view constraints
        let leftConstraint = textField.leftAnchor.constraintEqualToAnchor(view.leftAnchor)
        let rightConstraint = textField.rightAnchor.constraintEqualToAnchor(view.rightAnchor)
        let heightConstraint = textField.heightAnchor.constraintEqualToConstant(textFieldHeight)
        let verticalConstraint = textField.topAnchor.constraintEqualToAnchor(view.topAnchor, constant: 200)
        NSLayoutConstraint.activateConstraints([leftConstraint, rightConstraint, heightConstraint, verticalConstraint])

        // Tap gesture recognizer; if no text view is visible, shows text view at vertical location of tap
        tapGestureRecognizer.delegate = self
        tapGestureRecognizer.addTarget(self, action: "tapGesture:")
        view.addGestureRecognizer(tapGestureRecognizer)
    }

    func tapGesture(rec:UITapGestureRecognizer) {
        // Show the textView in a location?
        if textField.hidden == false {
            if (textField.text!.characters.count == 0) {
                hideTextField()
            } else {
                restoreTextFieldPosition()
            }
        } else {
            moveTextFieldToEditingPosition()
        }
    }


    func moveTextFieldToEditingPosition() {
        // Textview animates into position a la snapchat
        self.textField.userInteractionEnabled = false
        textField.hidden = false
        UIView.animateWithDuration(0.2, animations: { () -> Void in
            self.textField.center.y = self.textFieldTypingPositionY
            }, completion: { (Bool) -> Void in
                self.textField.userInteractionEnabled = true
                self.textField.becomeFirstResponder()
        })
    }

    func hideTextField() {
        // Hide text view and reset position
        textField.resignFirstResponder()
        textField.userInteractionEnabled = false
        UIView.animateWithDuration(0.2, animations: { () -> Void in
            }, completion: { (Bool) -> Void in
                self.textField.hidden = true
        })
    }



    func restoreTextFieldPosition() {
        // Restore original position of textview after exiting keyboard
        self.textField.userInteractionEnabled = false
        textField.resignFirstResponder()
        UIView.animateWithDuration(0.2, animations: { () -> Void in
            }, completion: { (Bool) -> Void in
                self.textField.userInteractionEnabled = true
        })
    }

}

推荐答案

我在使用 iOS 9 时遇到了这个问题.在 iOS 7 和 8 上没问题.基本上我在集合视图单元格中有一个 UITextField.有时,当用户完成输入和编辑结束时,文本弹跳"然后再次回到正确的位置.非常奇怪和烦人的故障.只需进行此调整即可解决 iOS 9 上的问题,并证明在 iOS 7 和 8 上是安全的:

I had this issue with iOS 9. It was ok on iOS 7 and 8. Basically I have a UITextField in a collection view cell. Sometimes when the user is done typing and editing ends, the text "bounces" up then down again into its correct position. Very strange and annoying glitch. Simply making this tweak fixed the issue on iOS 9 and proved to be safe on iOS 7 and 8:

 - (void)textFieldDidEndEditing:(UITextField *)textField
 {
    [textField layoutIfNeeded]; //Fixes iOS 9 text bounce glitch
    //...other stuff
 }

这篇关于UITextField:开始输入时,textfield向上弹起,然后向下弹起的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆