Scrollview и клавиатура Swift

Несколько более сложным способом было бы использовать setInterval() для проверки положения мыши и сравнения с последней проверкой. Если мышь не переместилась за определенное количество времени, пользователь, вероятно, не работает.

У этого есть дополнительное преимущество, говоря, что пользователь простаивает, вместо просто проверяя, не активировано ли окно.

Как отмечалось многими людьми, это не всегда хороший способ проверить, является ли пользователь или окно браузера бездействующим, так как пользователь может даже не использовать мышь или просматривает видео или подобное. Я просто предлагаю один из возможных способов проверить простоя.

40
задан GalinhaVoadora 1 November 2014 в 12:18
поделиться

1 ответ

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] для получения надлежащей высоты клавиатуры в первый раз.

2
ответ дан 7 November 2019 в 13:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: