inputAccessoryПросмотреть не получать сенсорные события на iPhone X - PullRequest
0 голосов
/ 18 ноября 2018

У меня есть вид, который я назначаю как inputAccessoryView моего контроллера вида.Я настроил ограничения так, чтобы он был выше индикатора «Домашний» на iPhone X (X, XR, XS, XS Max).Я сохраняю это значение inputAccessoryView в нижней части экрана, когда клавиатура скрыта, установив canBecomeFirstResponder на true в моем контроллере просмотра.

Это работает на всех телефонах, кроме семейства X.На всех телефонах X, на мой взгляд, не происходит никаких сенсорных событий - они попадают под вид под ним, как если бы inputAccessoryView там не было.

Tapping any of the buttons inside inputAccessoryView won't work

Если я ограничу основание суперпредставлением вместо safeArea, оно будет работать, но тогда оно будет слишком близко к исходному индикатору, который мне не нужен:

inputAccessoryView is too close to the home indicator

В этом радаре («inputAccessoryViews должен учитывать безопасную область, вставленную с внешней клавиатуры на iPhone X»), инженеры Apple говорят, что это не ошибка, и что разработчики должны ограничить одно изпросмотры родительского элемента safeAreaLayoutGuide:

Engineering предоставила следующие отзывы относительно этой проблемы: Вы несете ответственность за соблюдение safeAreaInsets входного вспомогательного представления.Мы разработали его таким образом, чтобы разработчики могли предоставлять фоновое представление (т. Е. См. Вспомогательное представление «Поиск на странице» в Safari) и планировать представление контента относительно safeAreaInsets.Это довольно просто сделать.Иметь иерархию представлений, в которой у вас есть представление контейнера и представление содержимого.Контейнерное представление может иметь цвет фона или фоновое представление, охватывающее все его границы, и оно выкладывает свое представление содержимого на основе safeAreaInsets.Если вы используете autolayout, это так же просто, как установить параметр bottomAnchor представления контента, равный safeAreaLayoutGuide его суперпредставления.

Я верю, что это именно то, что я делаю, но мне явно не хватаетчто-то, так как он ломается на X.

Проект GitHub находится здесь: https://github.com/nambatee/HorizontallyScrollableToolbarAccessoryView/tree/master/Horizontally%20Scrollable%20Toolbar%20Accessory%20View

1 Ответ

0 голосов
/ 21 января 2019

Ваша проблема на самом деле в том, что вы не устанавливаете высоту для inputAccessoryView, а ваш scrollView выходит за границы, поэтому вы не получаете сенсорные события и просто докажите, что если вы перейдете к виду верхнего уровня и установите это, чтобы обрезать границы и запустить свой проект, это то, что вы получаете sample

Так почему это происходит? потому что вы видите, что у вас нет intrinsicContentSize, вы можете присвоить ему intrinsicContentSize, создав подкласс UIView и переопределив intrinsicContentSize и вернув желаемую ширину и высоту, как это

class CustomView: UIView {
    override var intrinsicContentSize: CGSize {
        return CGSize.zero
    }
}

Не забудьте установить свой вид в CustomView в коде и в nib-файле

private lazy var horizontallyScrollableToolbarAccessoryView: CustomView? = {
        let nibName = "HorizontallyScrollableToolbarAccessoryView"
        let view = Bundle.main.loadNibNamed(nibName, owner: nil, options: nil)?.first as? CustomView
        return view
}()

Вы также можете указать высоту с помощью ограничения по высоте, например:

override func viewDidLoad() {
        super.viewDidLoad()
        self.horizontallyScrollableToolbarAccessoryView?.heightAnchor.constraint(equalToConstant: 80).isActive = true
}

но вам все равно нужно будет установить intrinsicContentSize на CGSize.Zero

class CustomView: UIView {
    override var intrinsicContentSize: CGSize {
        return CGSize.zero
    }
}

и вот что вы получите в конце рабочего scrollView

sample 2

...