Несколько более сложным способом было бы использовать setInterval()
для проверки положения мыши и сравнения с последней проверкой. Если мышь не переместилась за определенное количество времени, пользователь, вероятно, не работает.
У этого есть дополнительное преимущество, говоря, что пользователь простаивает, вместо просто проверяя, не активировано ли окно.
Как отмечалось многими людьми, это не всегда хороший способ проверить, является ли пользователь или окно браузера бездействующим, так как пользователь может даже не использовать мышь или просматривает видео или подобное. Я просто предлагаю один из возможных способов проверить простоя.
Swift 5 Только корректирует ScrollView, когда TextField скрыт клавиатурой (для нескольких TextFields)
, Добавляют / Удаляют Наблюдателей:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: UIResponder.keyboardWillChangeFrameNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil)
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
NotificationCenter.default.removeObserver(self)
}
Отслеживают эти значения, таким образом, можно возвратиться к исходному положению:
var scrollOffset : CGFloat = 0
var distance : CGFloat = 0
Корректируют ScrollView contentOffset в зависимости от Местоположения TextField:
@objc func keyboardWillShow(notification: NSNotification) {
if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
var safeArea = self.view.frame
safeArea.size.height += scrollView.contentOffset.y
safeArea.size.height -= keyboardSize.height + (UIScreen.main.bounds.height*0.04) // Adjust buffer to your liking
// determine which UIView was selected and if it is covered by keyboard
let activeField: UIView? = [textFieldA, textViewB, textFieldC].first { [112].isFirstResponder }
if let activeField = activeField {
if safeArea.contains(CGPoint(x: 0, y: activeField.frame.maxY)) {
print("No need to Scroll")
return
} else {
distance = activeField.frame.maxY - safeArea.size.height
scrollOffset = scrollView.contentOffset.y
self.scrollView.setContentOffset(CGPoint(x: 0, y: scrollOffset + distance), animated: true)
}
}
// prevent scrolling while typing
scrollView.isScrollEnabled = false
}
}
@objc func keyboardWillHide(notification: NSNotification) {
if distance == 0 {
return
}
// return to origin scrollOffset
self.scrollView.setContentOffset(CGPoint(x: 0, y: scrollOffset), animated: true)
scrollOffset = 0
distance = 0
scrollView.isScrollEnabled = true
}
Удостоверяются, что использовали [UIResponder.keyboardFrameEndUserInfoKey] для получения надлежащей высоты клавиатуры в первый раз.