У нас есть кнопки влево и вправо, настроенные для того, чтобы пользователь быстро просматривал разные автомобили. Контроллер просмотра страницы теряет контроллер просмотра, если пользователь быстро нажимает на следующую страницу 10 или более раз.
Ниже приведена страница автомобиля с изображением автомобиля (размыта, чтобы скрыть не относящуюся к делу информацию). Смотрите изображение здесь:
Если анимация прокрутки включена (true), она теряет страницу транспортного средства после быстрого нажатия стрелки вправо 6 или более раз. Смотрите изображение здесь:
код:
private func show(viewController:UIViewController, going direction: UIPageViewControllerNavigationDirection) {
let viewControllers = [viewController]
let isAnimated = true // false always works. However, animation is required.
setViewControllers(viewControllers, direction: direction, animated: isAnimated, completion: nil)
}
Во время отладки и когда контроллер просмотра страницы остановил показ автомобилей, я убедился, что установленный контроллер просмотра не равен нулю, а листинг (автомобиль) также не равен нулю.
Я попробовал вариант решения из UIPageViewController, как я могу правильно перейти на конкретную страницу, не нарушая порядок, указанный источником данных?, где завершение используется блок. Однако это не сработало.
weak var pvcw: UIPageViewController? = self
setViewControllers(viewControllers, direction: direction, animated: true, completion: {(_ finished: Bool) -> Void in
let pvcs: UIPageViewController? = pvcw
if pvcs == nil {
return
}
DispatchQueue.main.async(execute: {() -> Void in
pvcs?.setViewControllers(viewControllers, direction: direction, animated: false) {(_ finished: Bool) -> Void in }
})
})
Любые идеи? Спасибо.
Update
Я заметил, что иногда содержащийся контроллер просмотра может находиться вне центра, а не полностью отсутствует.
Я посмотрел глубже в сценарий отсутствия контроллера представления. Нажав "Иерархия просмотра отладки" и включив " Показывать сжатый контент, было показано следующее, когда полный контроллер View отсутствует:
Итак, кажется, что недостающее содержимое обрезается/выходит за пределы.
Отображение только каркасов показывает следующее:
Контроллер просмотра страницы имеет
- _UIPageViewControllerContentView, содержащий
- _UIQueuingScrollView, содержащий
- UIView, содержащий
- VehicleDetailTableViewController (UITableViewController с автомобильным изображением и деталями).
Я также вижу, что границы _UIQueuingScrollView совершенно разные, когда все странно. Оценки имеют x из 1125 в отличие от X 375, когда все нормально.
Это происходит только при использовании стиля перехода прокрутки в отличие от скручивания страницы. При использовании скручивания страниц все работает нормально.
Как мы можем предотвратить/исправить это?
Второе обновление
Этот код устраняет проблему. Тем не менее, это оставляет более резкий опыт. Возможно, из-за задержки 0,4 секунды синий фон иногда появляется при нормальном использовании.
private func show(viewController:UIViewController, going direction: UIPageViewControllerNavigationDirection) {
let viewControllers = [viewController]
setViewControllers(viewControllers, direction: direction, animated: true, completion: { (_) in
DispatchQueue.main.asyncAfter(deadline: .now() + 0.4, execute: {
self.setViewControllers(viewControllers, direction: direction, animated: false, completion: nil)
})
})
}
Это не очень хороший пользовательский интерфейс. Есть ли лучший подход?
Я хочу, чтобы изменения прокрутки были плавными, а не кратковременно отображали синий фон и не теряли его содержимое, а также содержимое View Controller.