В моем случае parent UIViewController
contains, UIPageViewController
который содержит, UINavigationController
который содержит UIViewController
. Мне нужно добавить жест смахивания к последнему контроллеру представления, но смахивания обрабатываются так, как будто они принадлежат контроллеру представления страницы. Я пытался сделать это как программно, так и через xib, но безрезультатно.
Итак, насколько я понимаю, я не могу достичь своей цели, пока не UIPageViewController
справлюсь с ее жестами. Как решить эту проблему?
pageViewControllerObject.view.userInteractionEnabled = NO;
UIPageViewController
рубрикеUINavigationController
. Заказчик хочет, чтобы контроллер навигации отображался жестом смахивания (если это возможно), но вместо этого обрабатывает контроллер просмотра страницыОтветы:
Задокументированный способ предотвращения
UIPageViewController
прокрутки - не назначатьdataSource
свойство. Если вы назначите источник данных, он перейдет в режим навигации на основе жестов, что вы пытаетесь предотвратить.Без источника данных вы вручную предоставляете контроллеры представления, когда хотите, с помощью
setViewControllers:direction:animated:completion
метода, и он будет перемещаться между контроллерами представления по запросу.Вышеизложенное можно вывести из документации Apple по UIPageViewController (Обзор, второй абзац):
источник
источник
for (UIView *view in self.pageViewController.view.subviews) {
Перевожу ответ user2159978 на Swift 5.1
источник
Реализация решения @ lee (@ user2159978) как расширения:
Использование: (в
UIPageViewController
)источник
var scrollView: UIScrollView? { for view in view.subviews { if let subView = view as? UIScrollView { return subView } } return nil }
Я уже некоторое время борюсь с этим и подумал, что должен опубликовать свое решение, следуя ответу Джесседа; удаление источника данных PageViewController.
Я добавил это в свой класс PgeViewController (связанный с моим контроллером просмотра страницы в раскадровке, наследует оба
UIPageViewController
иUIPageViewControllerDataSource
):Затем его можно вызвать при появлении каждого дополнительного представления (в данном случае для его отключения);
Я надеюсь, что это кому-то поможет, это не так чисто, как хотелось бы, но не кажется слишком хакерским и т. Д.
РЕДАКТИРОВАТЬ: Если кто-то хочет перевести это на Objective-C, сделайте это :)
источник
Изменить : этот ответ работает только для стиля загиба страницы. Ответ Джесседа намного лучше: работает независимо от стиля и полагается на задокументированное поведение .
UIPageViewController
предоставляет свой массив распознавателей жестов, которые вы можете использовать для их отключения:источник
Если вы хотите, чтобы у вас
UIPageViewController
сохранялась возможность пролистывания, при этом позволяя элементам управления контентом использовать свои функции (проведите пальцем для удаления и т. Д.), Просто выключитеcanCancelContentTouches
вUIPageViewController
.Поместите это в вашей
UIPageViewController
«SviewDidLoad
FUNC. (Swift)У
UIPageViewController
него есть автоматически сгенерированное подвид, которое обрабатывает жесты. Мы можем запретить этим подпредставлениям отменять жесты содержимого.Из...
Проведите пальцем по экрану, чтобы удалить tableView, который находится внутри pageViewController
источник
Полезное расширение
UIPageViewController
для включения и отключения свайпа.источник
Решил вот так (Swift 4.1)
источник
Быстрый способ ответа @lee
источник
Подобно ответу @ user3568340
Swift 4
источник
Благодаря ответу @ user2159978.
Я делаю это немного более понятным.
источник
Ответы, которые я нашел, кажутся мне очень запутанными или неполными, поэтому вот полное и настраиваемое решение:
Шаг 1:
Дайте каждому из ваших PVC-элементов ответственность определять, разрешена ли прокрутка влево и вправо или нет.
Каждый из ваших контроллеров представления PVC должен реализовывать вышеуказанный протокол.
Шаг 2:
В контроллерах PVC отключите прокрутку при необходимости:
Шаг 3:
Добавьте эффективные методы блокировки прокрутки в свой PVC:
Шаг 4:
Обновите атрибуты, связанные с прокруткой, при переходе на новый экран (если вы переходите на какой-то экран вручную, не забудьте вызвать метод enableScroll):
источник
Существует гораздо более простой подход, чем предлагают здесь большинство ответов, а именно возврат
nil
в обратных вызовахviewControllerBefore
иviewControllerAfter
dataSource.Это отключает жест прокрутки на устройствах iOS 11+, сохраняя при этом возможность использовать
dataSource
(для таких вещей, какpresentationIndex
/presentationCount
используется для индикатора страницы)Он также отключает навигацию через. что
pageControl
(точки в нижней части )источник
pageViewController.view.isUserInteractionEnabled = false
источник
Перевод ответа @ user2159978 на C #:
источник
(Swift 4) Вы можете удалить gestureRecognizers вашего pageViewController:
Если вы предпочитаете расширение:
и
pageViewController.removeGestureRecognizers
источник
Объявите это так:
Тогда используйте это так:
источник
Перечисление подпредставлений для поиска scrollView
UIPageViewController
не сработало для меня, так как я не могу найти scrollView в подклассе моего контроллера страницы. Итак, я решил отключить распознаватели жестов, но достаточно осторожно, чтобы не отключать необходимые.Итак, я придумал это:
Поместите это внутрь,
viewDidLoad()
и все готово!источник
Добавьте это в свой класс pageviewcontroller. 100% рабочий
источник
просто добавьте это свойство элемента управления в свой подкласс UIPageViewController :
источник