У меня возникли проблемы с автоматическим макетом и перемещением изображения вверх, когда на экране iOS отображается клавиатура, когда она закрыта. В Интернете можно найти различные решения, но наиболее распространенным является использование Центра уведомлений, чтобы получить размер клавиатуры и анимировать вид. Я создал IBOutlet для изменения ограничения, но получаю сообщение об ошибке. У значения типа 'UIView' нет члена 'passwordBottom'.
Может ли кто-нибудь помочь с ошибкой?
class LoginViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
@IBOutlet weak var usernameBottom: NSLayoutConstraint!
@IBOutlet weak var passwordBottom: NSLayoutConstraint!
@IBOutlet weak var usernameTF: UITextField!
@IBOutlet weak var passwordTF: UITextField!
var offsetY:CGFloat = 0
@IBAction func signinPressed(_ sender: Any) {
}
@IBAction func forgotPasswordPressed(_ sender: Any) {
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
NotificationCenter.default.addObserver( self, selector: #selector(keyboardWillShow(notification:)), name: UIResponder.keyboardWillShowNotification, object: nil )
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillShowNotification, object: nil)
}
@objc func keyboardWillShow( notification: Notification) {
if let keyboardFrame: NSValue = notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue {
let newHeight: CGFloat
let duration:TimeInterval = (notification.userInfo![UIResponder.keyboardAnimationDurationUserInfoKey] as? NSNumber)?.doubleValue ?? 0
let animationCurveRawNSN = notification.userInfo![UIResponder.keyboardAnimationCurveUserInfoKey] as? NSNumber
let animationCurveRaw = animationCurveRawNSN?.uintValue ?? UIView.AnimationOptions.curveEaseInOut.rawValue
let animationCurve:UIView.AnimationOptions = UIView.AnimationOptions(rawValue: animationCurveRaw)
if #available(iOS 11.0, *) {
newHeight = keyboardFrame.cgRectValue.height - self.view.safeAreaInsets.bottom
} else {
newHeight = keyboardFrame.cgRectValue.height
}
let keyboardHeight = newHeight + 10
UIView.animate(withDuration: duration,
delay: TimeInterval(0),
options: animationCurve,
animations: {
self.view.passwordBottom.constant = keyboardHeight
self.view.layoutIfNeeded() },
completion: nil)
}
}
}