自定义 TextField 不符合约束条件
Custom TextField does not comply to constraints
我在 HoshiTextField 上遇到这个问题已经有一段时间了,我也在 git 上打开了一个问题,但没有得到答案...
这是它应该的样子,如果用户选择 textField
:
当viewDidLoad
里面的textField
设置为becomeFirstResponder
或者当popping
设置ViewController
而textField
里面第一个 VC
被选中。显然这弄乱了 textField
的 frames
或 constraints
但我完全不知道如何解决这个问题。
如您所见,"Email-Adesse"-文本移动到左上角,当 pushing
和 poping
回到 ViewController
时,它移动到更远的地方constraints
。当使用调试器检查 View Hirarchy
时,"Email-Adresse"-Text 看起来很完美,即使它不是。在 viewDidAppear
内设置约束并没有改变任何东西。
我像其他所有元素一样约束 textFields
:
let emailTextField: HoshiTextField = {
let v = HoshiTextField()
v.borderActiveColor = .white
v.borderInactiveColor = .white
v.textColor = .white
v.font = UIFont(name: "AvenirNext-Regular", size: 17)
v.placeholder = "Email-Adresse"
v.placeholderColor = .white
v.placeholderFontScale = 0.8
v.minimumFontSize = 13
v.borderStyle = .line
v.autocapitalizationType = .none
v.translatesAutoresizingMaskIntoConstraints = false
return v
}()
emailTextField.topAnchor.constraint(equalTo: theLabel.bottomAnchor, constant: 20).isActive = true
emailTextField.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor, constant: 30).isActive = true
emailTextField.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -30).isActive = true
emailTextField.heightAnchor.constraint(equalToConstant: 60).isActive = true
如果有人能帮助我,我将不胜感激!希望问题清楚,大家也可以自己看看我的项目看看问题:
抱歉,一开始我误解了你的问题。
我觉得问题在于,在某些时候,当 HoshiTextField
被选中并离开屏幕时,它会被取消选中,但不会更新其布局。所以当你回来时,动画仍然保持相对相同,但从不同的角度来看。
我不确定如何准确解决该问题,但在将以下内容添加到您的 EmailVC
后,我能够使屏幕看起来正常
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
view.endEditing(true)
}
希望一切顺利。它并没有真正解决问题,但它确实让您的应用程序 UI 在这种情况下看起来很合适。
这里是完整的测试控制器,有 2 种可能的解决方案
演示:备用 1 - 经常出现已经展开
演示:Alternate 2 - 总是有延迟,展开是可见的
class ViewController2: UIViewController {
@IBOutlet weak var theLabel: UILabel!
private weak var emailTextField: HoshiTextField!
override func viewDidLoad() {
super.viewDidLoad()
emailTextField = {
let v = HoshiTextField()
v.borderActiveColor = .white
v.borderInactiveColor = .white
v.textColor = .white
v.font = UIFont(name: "AvenirNext-Regular", size: 17)
v.placeholder = "Email-Adresse"
v.placeholderColor = .white
v.placeholderFontScale = 0.8
v.minimumFontSize = 13
v.borderStyle = .line
v.autocapitalizationType = .none
v.translatesAutoresizingMaskIntoConstraints = false
return v
}()
self.view.addSubview(emailTextField)
emailTextField.topAnchor.constraint(equalTo: theLabel.bottomAnchor, constant: 20).isActive = true
emailTextField.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor, constant: 30).isActive = true
emailTextField.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -30).isActive = true
emailTextField.heightAnchor.constraint(equalToConstant: 60).isActive = true
// DispatchQueue.main.async {
// self.emailTextField.becomeFirstResponder() // Alternate 1
// }
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
emailTextField.becomeFirstResponder() // Alternate 2
}
}
我在 HoshiTextField 上遇到这个问题已经有一段时间了,我也在 git 上打开了一个问题,但没有得到答案...
这是它应该的样子,如果用户选择 textField
:
当viewDidLoad
里面的textField
设置为becomeFirstResponder
或者当popping
设置ViewController
而textField
里面第一个 VC
被选中。显然这弄乱了 textField
的 frames
或 constraints
但我完全不知道如何解决这个问题。
如您所见,"Email-Adesse"-文本移动到左上角,当 pushing
和 poping
回到 ViewController
时,它移动到更远的地方constraints
。当使用调试器检查 View Hirarchy
时,"Email-Adresse"-Text 看起来很完美,即使它不是。在 viewDidAppear
内设置约束并没有改变任何东西。
我像其他所有元素一样约束 textFields
:
let emailTextField: HoshiTextField = {
let v = HoshiTextField()
v.borderActiveColor = .white
v.borderInactiveColor = .white
v.textColor = .white
v.font = UIFont(name: "AvenirNext-Regular", size: 17)
v.placeholder = "Email-Adresse"
v.placeholderColor = .white
v.placeholderFontScale = 0.8
v.minimumFontSize = 13
v.borderStyle = .line
v.autocapitalizationType = .none
v.translatesAutoresizingMaskIntoConstraints = false
return v
}()
emailTextField.topAnchor.constraint(equalTo: theLabel.bottomAnchor, constant: 20).isActive = true
emailTextField.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor, constant: 30).isActive = true
emailTextField.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -30).isActive = true
emailTextField.heightAnchor.constraint(equalToConstant: 60).isActive = true
如果有人能帮助我,我将不胜感激!希望问题清楚,大家也可以自己看看我的项目看看问题:
抱歉,一开始我误解了你的问题。
我觉得问题在于,在某些时候,当 HoshiTextField
被选中并离开屏幕时,它会被取消选中,但不会更新其布局。所以当你回来时,动画仍然保持相对相同,但从不同的角度来看。
我不确定如何准确解决该问题,但在将以下内容添加到您的 EmailVC
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
view.endEditing(true)
}
希望一切顺利。它并没有真正解决问题,但它确实让您的应用程序 UI 在这种情况下看起来很合适。
这里是完整的测试控制器,有 2 种可能的解决方案
演示:备用 1 - 经常出现已经展开
演示:Alternate 2 - 总是有延迟,展开是可见的
class ViewController2: UIViewController {
@IBOutlet weak var theLabel: UILabel!
private weak var emailTextField: HoshiTextField!
override func viewDidLoad() {
super.viewDidLoad()
emailTextField = {
let v = HoshiTextField()
v.borderActiveColor = .white
v.borderInactiveColor = .white
v.textColor = .white
v.font = UIFont(name: "AvenirNext-Regular", size: 17)
v.placeholder = "Email-Adresse"
v.placeholderColor = .white
v.placeholderFontScale = 0.8
v.minimumFontSize = 13
v.borderStyle = .line
v.autocapitalizationType = .none
v.translatesAutoresizingMaskIntoConstraints = false
return v
}()
self.view.addSubview(emailTextField)
emailTextField.topAnchor.constraint(equalTo: theLabel.bottomAnchor, constant: 20).isActive = true
emailTextField.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor, constant: 30).isActive = true
emailTextField.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -30).isActive = true
emailTextField.heightAnchor.constraint(equalToConstant: 60).isActive = true
// DispatchQueue.main.async {
// self.emailTextField.becomeFirstResponder() // Alternate 1
// }
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
emailTextField.becomeFirstResponder() // Alternate 2
}
}