编辑 UITextField 时正在重置 UIScrollView

Posted

技术标签:

【中文标题】编辑 UITextField 时正在重置 UIScrollView【英文标题】:UIScrollView is being reset when editing UITextField 【发布时间】:2017-04-28 12:50:35 【问题描述】:

我是 Swift 3 的新手,我只是注意到我们需要滚动视图,因为当我们在文本字段中键入时,键盘可以覆盖一些小部件,就像在这个视频中一样。 Fixing UITextField-Keyboard Problems (Swift in Xcode).

但是,即使在以编程方式滚动视图之前,我也有一种不幸的行为。我的视图不断被重置为其初始位置。我做了一个video 来展示这种行为。

我找不到有关此问题的提及。有人有线索吗?

[编辑]

这是结构化的小部件

这是我的视图控制器代码:

import UIKit
import AVFoundation

class SignUpController: UIViewController, UITextFieldDelegate


    @IBOutlet var scrollView: UIScrollView!
    @IBOutlet var stackView: UIStackView!

    @IBOutlet var usernameTextField: UITextField!
    @IBOutlet var passwordTextField: UITextField!
    @IBOutlet var confirmationTextField: UITextField!
    @IBOutlet var emailTextField: UITextField!
    @IBOutlet var phoneTextField: UITextField!
    @IBOutlet var firstNameTextField: UITextField!
    @IBOutlet var lastNameTextField: UITextField!

    @IBOutlet var signUpButton: UIButton!

    var keyboardHeigh:CGFloat!

    override func viewDidLayoutSubviews() 
        super.viewDidLayoutSubviews()
        self.scrollView.contentSize = self.stackView.frame.size
        self.scrollView.contentSize.height += self.stackView.frame.minY + 20
    

    override func viewDidLoad() 
        super.viewDidLoad()

        let textFields :[UITextField] =
            [
                usernameTextField,
                passwordTextField,
                confirmationTextField,
                emailTextField,
                phoneTextField,
                firstNameTextField,
                lastNameTextField,
            ]

        for i in 0..<textFields.count
        
            textFields[i].delegate = self
            textFields[i].tag = i
        

        NotificationCenter.default.addObserver(self,
                                               selector: #selector(keyboardWillShow),
                                               name: .UIKeyboardWillShow, object: nil)
    

    func keyboardWillShow(notification: NSNotification)
    
        if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue
        
            keyboardHeigh = keyboardSize.height
        
    

    func textFieldShouldReturn(_ textField: UITextField) -> Bool
    
        // Try to find next responder
        if let nextField = textField.superview?.viewWithTag(textField.tag + 1) as? UITextField
        
            nextField.becomeFirstResponder()

        
        else
        
            // Not found, so remove keyboard.
            textField.resignFirstResponder()

        

        return false
    

【问题讨论】:

发布您的代码...也许您以编程方式在错误的位置滚动。 @Pintouch,已发布代码。 我打赌您的问题始于自动布局和约束。带有白色箭头图标的红色圆圈表示您的约束设置正确。再加上您正在尝试通过代码设置scrollView.contentSize,您会进一步搞砸事情。当您点击一个新字段时,自动布局引擎会根据(错误的)约束将滚动视图“重置”到适当的位置。 您可以查看this post(它是objective-c,但解释了ios 工作流程)。在我看来,如果您不想管理滚动视图,那么使用 UITableViewController 在单元格中添加您的 TextField 可能是一个更好的主意。 (您只需要自定义隐藏边框的单元格)而且您不必担心键盘。 我刚刚注意到,每当我选择 UITextField 时,viewDidLayoutSubviews 都会被调用两次。我正在调整viewDidLayoutSubviews 上的UIScrollView,因为我正在遵循教程,以便让我的UIScrollView 滚动而不是仅仅反弹。我只是尝试将下面的 sn-p 移动到 viewDidLoad 并且效果很好! self.scrollView.contentSize = self.stackView.frame.size; self.scrollView.contentSize.height += self.stackView.frame.minY + 20; 但我仍然愿意修复我的限制,正如@DonMag 解释的那样,它有问题。 【参考方案1】:

1.UItableViewController 可以带静态单元格,

2.将文本框放入单元格中。

3.选择单元格无。

4.使分隔符无。

它会正常工作的。

【讨论】:

以上是关于编辑 UITextField 时正在重置 UIScrollView的主要内容,如果未能解决你的问题,请参考以下文章

在 uitextfield 中滑动

UITextField 的标签在其键盘设置为数字键盘时重置?

滚动 UITableView 时自定义单元格中的 UITextField 文本正在更改

向下滚动并返回时 UITextField 进入 UITableViewCell 自动重置?

编辑时如何更改 UITextField

在 UITableView 中编辑 UITextField(启用/禁用输入)?