编辑 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 的标签在其键盘设置为数字键盘时重置?
滚动 UITableView 时自定义单元格中的 UITextField 文本正在更改