我正在使用 swift 并且在使用 TouchUpInside 时遇到问题:如果我使用的是 UIKeyboardWillChangeFrame 或 UIKeyboardWillShow/UIKeyboardWillHide,并且键盘正在显示,并且当最初显示键盘时,我尝试按下的按钮位于键盘后面。(如果我向下滚动到按钮直到可见并按下,则不会调用 touchUpInside)。
无论键盘是否显示,TouchDown 似乎都可以始终如一地工作,但不会调用 TouchUpInside。如果最初显示键盘时按钮位于键盘顶部上方,则 TouchUpInside 有效。我正在使用keyboardNotification 设置我的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")
}
视图将出现:
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。