2016-10-04 1 views
0

Я пишу серию настроек/настроек, используя 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 или лучший способ сделать это.

Пример экрана:

exampleenter image description here

+0

«Но я хотел бы заблокировать/отключить/заблокировать движение вперед до тех пор, пока настройки не будут выполнены пользователем на текущем экране». Ваша основная стратегия правильная. Метод делегата 'viewControllerAfterViewController' должен просто возвращать' nil', чтобы предотвратить перемотку вперед. – matt

+0

@matt, Как указано в 2), он блокирует, но не разблокирует, после того, как я изменил переменную среды, которая сообщила ему о блокировке. И я не могу обновить фреймворк, поэтому он снова вызывает функцию, чтобы разблокировать ее. Он остается застревающим, если пользователь не вернется на предыдущую страницу и не переместится на страницу, которая была заблокирована. – Lombas

+0

Правильно, это должно быть из-за того, что время выполнения говорит себе: «Эй, я уже знаю ответ для этого контроллера представлений», поэтому мне не нужно снова называть этот метод. Но вот почему предложение @ kocakmstf имеет смысл. Вам нужно подставить другой контроллер представлений, самостоятельно, снабжая _new instance_ того же контроллера представления, чтобы метод делегата снова вызывался. – matt

ответ

0

только как предложение, вы можете перезагрузить источник данных с setViewControllers:direction:animated:completion после того как ваша работа сделана. Это должно исправить вашу следующую страницу. Его код obj-c. он должен иметь тот же код в быстром.

+0

, к сожалению, не работает. Не вызывает снова функцию viewControllerAfterViewController. :-( – Lombas

0

Используйте свойство gestureRecognizers UIPageViewController. Это массив распознавателей жестов. Перейдите через распознаватели жестов, установив каждый из isEnabled на false. Когда будете готовы, сделайте это снова с true.

Даже проще, просто установите UIPageViewController в view «s isUserInteractionEnabled к false, а затем true.

+0

Не работает, потому что он блокирует как жест вперед, так и наоборот. Оба распознаются с помощью жестов sabeRecognizer. :-( – Lombas

+0

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

+0

Я думаю, что мне придется отключить стандартное взаимодействие, не назначая dataSource и не реализуя интеграцию жеста сам. – Lombas