Я пишу серию настроек/настроек, используя uiPageViewController (изображения внизу). Пользователь настраивает материал и прокручивается до следующего экрана и так далее. Но я хотел бы заблокировать/отключить/заблокировать прокрутку вперед до тех пор, пока настройки не будут выполнены пользователем на текущем экране.Отключить временную перемотку вперед только в uiPageViewController
Я пробовал:
1) uiPageViewController.view.userInteractionEnabled = ложь. Он блокирует все на экране, включая обратную прокрутку. Я хочу заблокировать только форвард.
2)
func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {
if !forwardSwipeEnabled {
return nil
}
var index = contentViewControllers.indexOf(viewController)
index += 1
return contentViewControllers[index]
}
к return nil
, когда forwardSwipeEnabled
установлен в false
, и она работает, но вперед салфетки остается заблокированным даже после того, как я меняю forwardSwipeEnabled = верно, потому что UIPageViewController уже называют эту функцию, когда сцена появилась на экране.
Если я снова и снова вернусь, функция снова будет вызвана, и она будет работать.
----- ----- редактировать
Вызова pageViewController!.setViewControllers(viewControllers, direction: .Forward, animated: false, completion: nil)
с текущим контроллером представления не обновить или снова вызвать функцию.
3) Только добавьте следующий экран (UIViewcontroller) после завершения пользователем, но та же проблема, что и в случае 2).
----- ----- редактировать
4) Я могу получить gestureRecognizers с view.subviews.first?.gestureRecognizers
, но установка их gestureRecognize.enabled = false
блоки как вперед и назад. Для каждого из них нет разных жестов для распознавания.
5) Перехват жест и его прием, когда направление направлено вперед или позволяет запустить его, при этом нижний код, когда он не работает, не работает, потому что пользователь может запустить салфетки назад, вызвать функцию возврата и закончить вперед.
override func viewDidLoad() {
super.viewDidLoad()
for view: UIView in pageViewController!.view.subviews {
if (view is UIScrollView) {
let scrollView = (view as! UIScrollView)
self.scrollViewPanGestureRecognzier = UIPanGestureRecognizer()
self.scrollViewPanGestureRecognzier.delegate = self
scrollView.addGestureRecognizer(scrollViewPanGestureRecognzier)
}
}
}
func gestureRecognizerShouldBegin(gestureRecognizer: UIGestureRecognizer) -> Bool {
if gestureRecognizer == scrollViewPanGestureRecognzier {
guard let panGestureRecognizer = gestureRecognizer as? UIPanGestureRecognizer else { return false }
let velocity = panGestureRecognizer.velocityInView(view)
let translation = panGestureRecognizer.translationInView(view)
if translation.x < 0 {
return true
}
if velocity.x < 0 {
return true
}
return false
}
return false
}
Ищете способ, чтобы вызвать функцию, которая будет вызвана снова программно измените gestureRecognizer или лучший способ сделать это.
Пример экрана:
«Но я хотел бы заблокировать/отключить/заблокировать движение вперед до тех пор, пока настройки не будут выполнены пользователем на текущем экране». Ваша основная стратегия правильная. Метод делегата 'viewControllerAfterViewController' должен просто возвращать' nil', чтобы предотвратить перемотку вперед. – matt
@matt, Как указано в 2), он блокирует, но не разблокирует, после того, как я изменил переменную среды, которая сообщила ему о блокировке. И я не могу обновить фреймворк, поэтому он снова вызывает функцию, чтобы разблокировать ее. Он остается застревающим, если пользователь не вернется на предыдущую страницу и не переместится на страницу, которая была заблокирована. – Lombas
Правильно, это должно быть из-за того, что время выполнения говорит себе: «Эй, я уже знаю ответ для этого контроллера представлений», поэтому мне не нужно снова называть этот метод. Но вот почему предложение @ kocakmstf имеет смысл. Вам нужно подставить другой контроллер представлений, самостоятельно, снабжая _new instance_ того же контроллера представления, чтобы метод делегата снова вызывался. – matt