Пустое место под клавиатурой iOS - PullRequest
7 голосов
/ 13 мая 2019

В моем приложении для iOS после второго представления клавиатуры под клавиатурой остается пустое место.

Keyboard space

Пробел скрывается послепри нажатии .?123.

я удалил keyboardWillShowNotification и keyboardWillHideNotification, и происходит то же самое.Я изменяю размер UITextView на viewWillTransitionToSize:withTransitionCoordinator:, но я удаляю код для изменения размера, и происходит то же самое.

Это не происходит с моим iPhone 7, но происходит с моим iPad 6-го поколения.Это очень странно, потому что это только в моем приложении в этом конкретном текстовом представлении.

Это случилось с кем-то?Я ничего не могу найти в Google.

Вот исходный код View Controller: https://github.com/ColdGrub1384/Pyto/blob/master/Pyto/View%20Controllers/EditorViewController.swift

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

Ответы [ 2 ]

0 голосов
/ 06 июня 2019

iOS / iPadOS 13 исправляет эту ошибку.

0 голосов
/ 21 мая 2019
@objc protocol KeyboardConstraintListener: class
{
func didOpenKeyboard()
func didCloseKeyboard()
}

class KeyboardConstraint: NSLayoutConstraint
{
@IBOutlet
weak var listener: KeyboardConstraintListener?

@IBInspectable
var skipAutoCalculateMarginToBottom: Bool = false

@IBInspectable
var keepMarginWhenOpen: Bool = false

private var originalConstant: CGFloat = 0.0

override func awakeFromNib()
{
    super.awakeFromNib()
    self.originalConstant = self.constant

    NotificationCenter.default.addObserver(self,
                                           selector: #selector(keyboardWillShow),
                                           name: UIResponder.keyboardWillShowNotification,
                                           object: nil)

    NotificationCenter.default.addObserver(self,
                                           selector: #selector(keyboardWillHide),
                                           name: UIResponder.keyboardWillHideNotification,
                                           object: nil)
}

deinit
{
    NotificationCenter.default.removeObserver(self)
}

@objc func keyboardWillShow(notification: Notification)
{
    self.listener?.didOpenKeyboard()
    self.updateConstant(notification: notification, showing: true)
}

@objc func keyboardWillHide(notification: Notification)
{
    self.listener?.didCloseKeyboard()
    self.updateConstant(notification: notification, showing: false)
}

private func updateConstant(notification: Notification, showing: Bool)
{
    let duration: TimeInterval = (notification.userInfo?[UIResponder.keyboardAnimationDurationUserInfoKey] as? Double) ?? 0.2

    guard let endFrame = notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? CGRect else
    {
        return
    }

    guard let firstView: UIView = self.getView(item: self.firstItem) else
    {
        return
    }

    guard let secondView: UIView = self.getView(item: self.secondItem) else
    {
        return
    }

    guard let superview: UIView = firstView.superview else
    {
        return
    }

    let keyboardHeight: CGFloat = (showing ? max(endFrame.size.height - self.modifier(view: secondView), 0.0) : 0.0)

    CATransaction.begin()
    CATransaction.setDisableActions(true)
    superview.layoutIfNeeded()
    CATransaction.commit()

    UIView.animate(
        withDuration: duration,
        delay: 0,
        options: [.curveLinear],
        animations:
        {
            self.constant = keyboardHeight + self.originalConstant
            superview.layoutIfNeeded()
    },
        completion: nil)
}

private func modifier(view: UIView) -> CGFloat
{
    guard let window: UIWindow = view.window else
    {
        return 0.0
    }

    guard let superview: UIView = view.superview else
    {
        return 0.0
    }

    guard !self.skipAutoCalculateMarginToBottom else
    {
        return 0.0
    }

    let origin: CGPoint = superview.convert(view.frame.origin, to: nil)
    let bottom = origin.y + view.bounds.size.height
    let expand = window.bounds.size.height - bottom
    return expand - (self.constant - self.originalConstant) - (self.keepMarginWhenOpen ? self.originalConstant : 0.0)
}

private func getView(item: AnyObject?) -> UIView?
{
    if let view = item as? UIView
    {
        return view
    }
    else if let view = (item as? UILayoutGuide)?.owningView
    {
        return view
    }
    return nil
}

}

Создайте ограничение так, чтобы textView.bottom = safeArea.bottom

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...