【问题标题】:UIScrollView is being reset when editing UITextField编辑 UITextField 时正在重置 UIScrollView
【发布时间】: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 解释的那样,它有问题。

标签: ios iphone swift uiscrollview


【解决方案1】:

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

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

3.选择单元格无。

4.使分隔符无。

它会正常工作的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    • 2012-12-19
    • 1970-01-01
    相关资源
    最近更新 更多