UITextField 移动时出错
Posted
技术标签:
【中文标题】UITextField 移动时出错【英文标题】:Error with UITextField moving 【发布时间】:2016-01-01 00:34:33 【问题描述】:我正在尝试在我的应用程序中设计一个视图,当 UITextField
中的文本与某个正则表达式不匹配时,该视图会显示错误 UILabel
。一切正常,除非我的UITextField
包含无效条目,然后我点击屏幕关闭键盘。键盘关闭后,UITextField
移动到我的UITextView
(红色文本)之上,我不知道为什么。我在我的代码中设置了断点,但似乎我的代码在键盘关闭后都没有执行。任何帮助表示赞赏。
//
// ViewController.swift
// KeyboardLabel
//
import UIKit
class ViewController: UIViewController
@IBOutlet var titleLabel:UILabel!
@IBOutlet var errorLabel:UITextView!
@IBOutlet var textBox:UITextField!
@IBOutlet var createButton:UIButton!
var deltaHeight:CGFloat!
var beenMoved = true
override func viewDidLoad()
super.viewDidLoad()
// Register for notifications when the text in the text field is changed
NSNotificationCenter.defaultCenter().addObserver(self, selector: "validateText", name: UITextFieldTextDidChangeNotification, object: textBox)
// Add a gesture recognizer to dismiss the keyboard
view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: "dismissKeyboard"))
// Set the text of the labels
titleLabel.text = "Container Number:"
errorLabel.text = "Error, Invalid container number.\nRe-enter number."
// Calculate the height to move the text field and button
deltaHeight = errorLabel.frame.size.height + 8.0
override func didReceiveMemoryWarning()
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
func dismissKeyboard()
textBox.resignFirstResponder()
func validateText()
dispatch_async(dispatch_get_main_queue(),
// Regular expression for determining whether the text is valid
let predicate = NSPredicate(format: "SELF MATCHES %@", "[a-zA-Z0-9#]+")
let empty = self.textBox.text!.isEmpty
let valid = predicate.evaluateWithObject(self.textBox.text)
// If the string is valid
if valid || empty
// If the view has been moved down
if(!self.beenMoved)
// Hide the error label then move the text field and create button up
self.errorLabel.hidden = true
UIView.animateWithDuration(0.4, animations:
self.textBox.frame.origin.y -= self.deltaHeight
self.createButton.frame.origin.y -= self.deltaHeight
)
// Flip the flag
self.beenMoved = true
// If the string is invalid
else
// If the view has been moved up
if(self.beenMoved)
// Show the error label then move the text field and create button down
UIView.animateWithDuration(0.4, animations:
self.textBox.frame.origin.y += self.deltaHeight
self.createButton.frame.origin.y += self.deltaHeight
, completion:
(flag:Bool) in
self.errorLabel.hidden = false
)
// Flip the flag
self.beenMoved = false
// If the text field is empty
if empty
// Disable the create button
self.createButton.enabled = false
else
// Enable the create button
self.createButton.enabled = true
)
【问题讨论】:
我怀疑您因为自动布局而遇到麻烦。使用自动布局时,您不应该更改视图的框架。您应该创建@IBOutlet
s 来约束定位视图,并更新代码中的constant
属性以重新定位视图。
@vacawama 谢谢。我通过创建@IBOutlet
s 解决了这个问题,控制errorLabel
的高度和textBox
的顶部间距。
【参考方案1】:
这种行为实际上是这样的,如果您输入的内容与正则表达式不匹配,则 UITextField 最初会移动到 UITextView 的顶部。这是因为您正在使用以下代码行移动 UITextField 和按钮:
self.textBox.frame.origin.y += self.deltaHeight
self.createButton.frame.origin.y += self.deltaHeight
当键盘关闭时,UITextField 和 UIButton 会返回到它们的原始位置。我假设您对 UI 元素没有任何限制。
【讨论】:
以上是关于UITextField 移动时出错的主要内容,如果未能解决你的问题,请参考以下文章
如何设置 swift 3 UITextField 边框颜色?