2016-01-14 3 views
1

Я видел аналогичный вопрос here, но без рабочего решения.UIPageViewController Swipe Conditional On UIScrollView

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

Поведение по умолчанию немного отрывочно. Похоже, что распознаватели жестов конкурируют, а в некоторых случаях прокручивается UIScrollView, а в других случаях PageView просто переходит на следующую страницу. Я хотел бы привязать это поведение к смещению содержимого UIScrollView или что-то в этом роде.

Я буду экспериментировать с методами requireFail на различных распознавателях жестов, но похоже, что все свойства распознавателя жестов PageView ничтожны, потому что я использую тип перехода по прокрутке. Итак ... идя по иерархии?

В любом случае, я был бы признателен, если кто-нибудь знает, что это простое решение.

ответ

0

Способ, которым я решил это решить, был заменен на UIPageViewController: EMPageViewController. Поскольку у меня был прямой доступ к UIScrollView, я смог подклассифицировать его.

Раствор в основном пришли в подклассов и добавления переключаемые флаги к UIScrollView с (один для EMPageViewController и один внутри него), чтобы контролировать, когда они должны быть активными или нет, на основе различных факторов (таких, как содержание смещения одного из видов прокрутки). Затем я смог переопределить gestureRecognizerShouldBegin:gestureRecognizer по-разному в подклассах UIScrollView, проверив флажки переключения и скорость распознавания жеста панорамирования.

Что-то вроде этого (код из контекста):

import UIKit 

class CustomScrollView: UIScrollView { 

    // these toggles get set by some senior ViewController 
    var lockDown = false 
    var lockUp = false 

    override func gestureRecognizerShouldBegin(gestureRecognizer: UIGestureRecognizer) -> Bool { 
     print("= gesture starting") 
     if let panner = gestureRecognizer as? UIPanGestureRecognizer { 
      if panner.velocityInView(self).y < 0.0 { 
       print("== pulling down, lockDown: \(lockDown)") 
       if lockDown { 
        print("=== cancelling paging scroll") 
        return false 
       } 
      } 
      if panner.velocityInView(self).y > 0.0 { 
       print("== pulling up, lockUp: \(lockUp)") 
       if lockUp { 
        print("=== cancelling paging scroll") 
        return false 
       } 
      } 
     } 

     return super.gestureRecognizerShouldBegin(gestureRecognizer) 
    } 

} 

Во всяком случае, я получить все это работает гладко, в конце концов. У каждого, вероятно, будет несколько другой вариант использования, но в итоге вам нужно подклассы UIScrollView, и поэтому UIPageViewController не является вариантом.

Смежные вопросы