Управление отображением экрана и нижней кнопкой, когда клавиатура открыта и скрыта в iOS так же, как Android - PullRequest
0 голосов
/ 12 декабря 2018

Ожидаемая функциональность такая же, как это происходит в устройствах Android (см. Ниже изображения):

When Keyboard is not open Android

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

When Keyboard is Open Android

Я пытаюсь реализовать те же функции в моем приложении iOS.Вот мой код:

    @objc func keyboardWillChangeFrame(_ notification: Notification?) {
    guard let keyboardRect = (notification?.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue else {return}

    let screenY = UIScreen.main.bounds.height
    let shrunkViewHeight = screenY - keyboardRect.height
    self.forwardButton.frame.origin.y = keyboardRect.origin.y
    if (shrunkViewHeight < screenY/1.5) {
        let screenShift = ((screenY/2) - shrunkViewHeight)
        if notification?.name == UIResponder.keyboardWillShowNotification || notification?.name == UIResponder.keyboardWillChangeFrameNotification {
            UIView.animate(withDuration: 1.0) {
                self.view.frame.origin.y = screenShift

            }
        }else{
            UIView.animate(withDuration: 1.0) {
                self.view.frame.origin.y = 0
            }
        }
    }
}

Что происходит сейчас: Кнопка иногда остается внизу, особенно когда первый респондент переключается с одного TextField на другое, не закрывая клавиатуру.

Ожидаемое решение: упомянутая функциональность должна работать на всех iPhone от iPhone 6 до последней версии XR.Открыты для сторонних предложений.

Ответы [ 3 ]

0 голосов
/ 12 декабря 2018

Swift 3

@IBOutlet weak var BottomConstraint: NSLayoutConstraint! //your last item in bottom of your view controller constraint

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(true)

    self.registerForKeyboardNotifications()
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)

    self.deregisterFromKeyboardNotifications()
}


func registerForKeyboardNotifications() {
    NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardNotification(_:)), name: NSNotification.Name.UIKeyboardWillChangeFrame, object: nil)
}

func deregisterFromKeyboardNotifications() {
    NotificationCenter.default.removeObserver(self)
}

func keyboardNotification(_ notification: Foundation.Notification) {

    if let userInfo = notification.userInfo {

        let endFrame = (userInfo[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue
        let duration:TimeInterval = (userInfo[UIKeyboardAnimationDurationUserInfoKey] as? NSNumber)?.doubleValue ?? 0
        let animationCurveRawNSN = userInfo[UIKeyboardAnimationCurveUserInfoKey] as? NSNumber
        let animationCurveRaw = animationCurveRawNSN?.uintValue ?? UIViewAnimationOptions().rawValue
        let animationCurve:UIViewAnimationOptions = UIViewAnimationOptions(rawValue: animationCurveRaw)

        if (endFrame?.origin.y)! >= UIScreen.main.bounds.size.height {
            self.sendCmntViewBottomConstraint?.constant = 0.0
        } else {
            self.sendCmntViewBottomConstraint?.constant = endFrame!.size.height
        }

        UIView.animate(withDuration: duration, delay: TimeInterval(0), options: animationCurve, animations: { self.view.layoutIfNeeded() }, completion: nil)

    }
}
0 голосов
/ 12 декабря 2018

Swift 4

@IBOutlet weak var BottomConstraint: NSLayoutConstraint! //your last item in bottom of your view controller constraint

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(true)

    self.registerForKeyboardNotifications()
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)

    self.deregisterFromKeyboardNotifications()
}


func registerForKeyboardNotifications() {
    NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardNotification(_:)), name: UIResponder.keyboardWillChangeFrameNotification, object: nil)
}

func deregisterFromKeyboardNotifications() {
    NotificationCenter.default.removeObserver(self)
}

@objc func keyboardNotification(_ notification: Foundation.Notification) {
    if let userInfo = notification.userInfo {
        let endFrame = (userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue
        let duration:TimeInterval = (userInfo[UIResponder.keyboardAnimationDurationUserInfoKey] as? NSNumber)?.doubleValue ?? 0
        let animationCurveRawNSN = userInfo[UIResponder.keyboardAnimationCurveUserInfoKey] as? NSNumber
        let animationCurveRaw = animationCurveRawNSN?.uintValue ?? UIView.AnimationOptions().rawValue
        let animationCurve:UIView.AnimationOptions = UIView.AnimationOptions(rawValue: animationCurveRaw)
        if (endFrame?.origin.y)! >= UIScreen.main.bounds.size.height {
            self.requestBttnButtomMargin?.constant = 24.0
        } else {
            self.requestBttnButtomMargin?.constant = endFrame!.size.height + 10
        }
        UIView.animate(withDuration: duration,
                       delay: TimeInterval(0),
                       options: animationCurve,
                       animations: { self.view.layoutIfNeeded() },
                       completion: nil)
    }
}

}

0 голосов
/ 12 декабря 2018

Несколько моментов: 1. Ваш пример кода не показывает его, но кажется, что вы отправляете все уведомления с помощью этого метода.Я рекомендую обрабатывать willView и willHide отдельно.Возможно, вам не нужно подписываться на didChangeFrame.

Что такое проверка shrunkViewHeight

Использование UIScreen здесь опасно, особенно для iPad или приложений, поддерживающих альбомную ориентацию.Вместо этого проверьте против view.frame.

Используете ли вы автоматическое расположение?В этом случае обратите внимание на обработку изменения путем изменения ограничения.

Вот пример кода для willShow, который должен помочь вам в вашем пути:

    var viewFrame = view.frame
    viewFrame.size.height -= keyboardRect.height
    if viewFrame.contains(forwardButton.frame) {
        return // Do nothing, button is visible
    }
    // Modify your button frame here
...