Я использую swift и у меня возникают проблемы с TouchUpInside: если я использую UIKeyboardWillChangeFrame или UIKeyboardWillShow / UIKeyboardWillHide, и клавиатура отображается, а кнопка, которую я пытаюсь нажать, находится за клавиатурой, когда клавиатура отображается изначально. (Если я прокручиваю вниз до кнопки до появления и нажимаю, touchUpInside не вызывается.)
Кажется, что TouchDown работает одинаково независимо от того, показывает клавиатура или нет, но TouchUpInside не вызывается. Если кнопка находится над верхней частью клавиатуры, когда клавиатура изначально отображается, TouchUpInside работает. Я использую Keyboard Notification, чтобы установить высоту представления ниже моего scrollView, чтобы поднять мой scrollView, когда клавиатура отображается. Из того, что я вижу, это обычно только когда кнопка является последним элементом в scrollView (и поэтому, вероятно, будет позади клавиатуры, когда клавиатура показана).
@IBOutlet var keyboardHeightLayoutConstraint: NSLayoutConstraint?
@IBOutlet weak var textField: UITextField!
@IBOutlet weak var saveButton: UIButton!
@IBAction func saveTouchUpInside(_ sender: UIButton) {
print("touchupinside = does not work")
}
@objc func saveTouchDown(notification:NSNotification){
print("touchdown = works")
}
viewWillAppear:
textField.delegate = self
NotificationCenter.default.addObserver(self,selector:#selector(self.keyboardNotification(notification:)),name:
NSNotification.Name.UIKeyboardWillChangeFrame,object: nil)
self.saveButton.addTarget(self, action:#selector(ViewController.saveTouchDown(notification:)), for: .touchDown)
deinit {
NotificationCenter.default.removeObserver(self)
}
@objc func keyboardNotification(notification: NSNotification) {
if let userInfo = notification.userInfo {
let endFrame = (userInfo[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue
let endFrameY = endFrame?.origin.y ?? 0
let duration:TimeInterval = (userInfo[UIKeyboardAnimationDurationUserInfoKey] as? NSNumber)?.doubleValue ?? 0
let animationCurveRawNSN = userInfo[UIKeyboardAnimationCurveUserInfoKey] as? NSNumber
let animationCurveRaw = animationCurveRawNSN?.uintValue ?? UIViewAnimationOptions.curveEaseInOut.rawValue
let animationCurve:UIViewAnimationOptions = UIViewAnimationOptions(rawValue: animationCurveRaw)
if endFrameY >= UIScreen.main.bounds.size.height {
self.keyboardHeightLayoutConstraint?.constant = 0.0
} else {
self.keyboardHeightLayoutConstraint?.constant = endFrame?.size.height ?? 0.0
}
UIView.animate(withDuration: duration, delay: TimeInterval(0),options: animationCurve, animations: { self.view.layoutIfNeeded() }, completion: nil)
}
}
Я хотел бы закрыть клавиатуру и вызвать saveTouchUpInside одновременно, без использования TouchDown.