2015-05-13 3 views
2

У меня есть UIViewController с переменной UIPageViewController.Отключить салфетки в UIPageViewController

Я пытаюсь отключить прокрутку для UIPageViewController для определенных позиций на экране. Я делаю это, установив UIViewController как UIGestureRecognizerDelegate и установив распознаватели жестов в делегате UIPageViewController на себя (UIViewController). Кажется, я не могу найти, где распознаватели жеста или загружаются для UIPageViewController.

Я попробовал эти три места, и все приходят с пустыми в viewDidLoad метода:

println("gesture\(self.pageViewController!.gestureRecognizers)") 
println("gesture\(self.view.gestureRecognizers)") 
println("gesture\(self.pageViewController!.view.gestureRecognizers)") 

UPDATE *******************:

поэтому я нашел некоторые UIGestureRecognizers, скрывающиеся в navigationController, но добавление их в качестве делегатов и запуск кода ниже ничего не делает. Это потому, что у меня неправильные идентификаторы UIGestureRecognizers. Там есть один, который также является UIPanGestureRecognizer. Почему бы мне не получить распознавателей в моем контролеры страниц или в представлении моего контроллера страницы?

func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool { 
    println("Should recieve touch") 
    return false 
} 

Я получаю «должен получить прикосновение», чтобы печатать в журналах, но я возвращаю ложь и не пролистывание не будет отключена. Что я делаю не так?

ответ

3

К прошлому я попытался сделать что-то подобное с UIScrollView. У UIScrollView есть член с именем panGesture. Но вы можете цикл на pageViewControllerGesture, как это (проверено на стандартной страницы на основе применения):

override func viewDidLoad() { 
    super.viewDidLoad() 

    // other set up 

    // loop over your pageViewController gestures 
    for gesture in self.pageViewController!.gestureRecognizers 
    { 
     // get the good one, i discover there are 2 
     if(gesture is UIPanGestureRecognizer) 
     { 
      // replace delegate by yours (Do not forget to implement the gesture protocol) 
      (gesture as! UIPanGestureRecognizer).delegate = self 
     } 
    } 

} 

func gestureRecognizerShouldBegin(gestureRecognizer: UIGestureRecognizer) -> Bool 
{ 
    // add custom logic 
    var ShouldISwipe = rand()%2 == 0 
    println("Should I Swipe : \(ShouldISwipe)") 
    return ShouldISwipe 
} 

Я нашел эту ссылку, которая могла бы помочь тоже (должны быть преобразованы в скор): http://www.lukaszielinski.de/blog/posts/2014/03/26/restrict-panning-of-uipageviewcontroller-to-certain-area/

Надежда что могло бы помочь.

+1

проблемы в том, что self.pageViewController .gestureRecognizers возвращает пустой массив – Tyler

+0

решения! от ссылки и информации, которую вы видите здесь, являются идеальным решением, если у вас есть UIPageViewController на основе прокрутки. –

+1

Нет, это не сработает, переопределив делегат gestureRecognizer: «*** Завершение приложения из-за неотображенного исключения» NSInvalidArgumentException », причина:« Встроенный распознаватель жестов в UIScrollView должен иметь вид прокрутки в качестве своего делегата ». ' – davidgoli

0

Вы можете получить жест распознаватель UIPageViewController с:

UIPageViewController.view.subviews.first 

В моем тесте я получаю:

- [0] : <UIScrollViewDelayedTouchesBeganGestureRecognizer: 0x17e57f20; state = Possible; delaysTouchesBegan = YES; view = <_UIQueuingScrollView 0x1842b800>; target= <(action=delayed:, target=<_UIQueuingScrollView 0x1842b800>)>> 
- [1] : <UIScrollViewPanGestureRecognizer: 0x17e58470; state = Possible; delaysTouchesBegan = YES; delaysTouchesEnded = NO; view = <_UIQueuingScrollView 0x1842b800>; target= <(action=handlePan:, target=<_UIQueuingScrollView 0x1842b800>)>; must-fail = { 
    <UIScrollViewPagingSwipeGestureRecognizer: 0x17d50110; state = Possible; view = <_UIQueuingScrollView 0x1842b800>; target= <(action=_handleSwipe:, target=<_UIQueuingScrollView 0x1842b800>)>> 
}> 
- [2] : <UIScrollViewPagingSwipeGestureRecognizer: 0x17d50110; state = Possible; view = <_UIQueuingScrollView 0x1842b800>; target= <(action=_handleSwipe:, target=<_UIQueuingScrollView 0x1842b800>)>; must-fail-for = { 
    <UIScrollViewPanGestureRecognizer: 0x17e58470; state = Possible; delaysTouchesBegan = YES; delaysTouchesEnded = NO; view = <_UIQueuingScrollView 0x1842b800>; target= <(action=handlePan:, target=<_UIQueuingScrollView 0x1842b800>)>> 
}>