【发布时间】: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