拦截UIPageViewController的UIPanGestureRecognizer会破坏UIPageViewController的行为

时间:2016-07-26 18:24:49

标签: ios swift

我试图将UIPageViewController的UIPanGestureRecognizer分配给不同的(自定义)视图,以便用于页面切换的平移手势仅适用于屏幕的某个区域。代码基本上如下:

let testView = UIView(frame: CGRect(x: 0, y:self.view.frame.height/2, width: 320, height: self.view.frame.height/2))
self.view.addSubview(testView)
for gr in self.pageViewController!.view.subviews[0].gestureRecognizers! {            
        if gr.isKindOfClass(UIPanGestureRecognizer) {
            testView.addGestureRecognizer(gr)
        }
}

问题是" next"在进行平移时,视图控制器不会立即可见,在第一次平移时,它看起来当前的视图控制器(第一个)是PageViewController中唯一的一个,只有在结束平移并进行第二次平移之后视图控制器出现。

请注意,如果不将UIPanGesture分配给不同的视图,则PageViewController将按预期工作,并且自第一次平移以来可见下一个视图控制器。

我为什么要这样做?我需要在PageViewController中的视图控制器中添加一个子视图,该视图控制器没有" pan"当用户在其上面做手势时,PageViewController。

1 个答案:

答案 0 :(得分:0)

UIPageViewController

class PageController:UIPageViewController {

    let viewControllers:[UIViewController] = [MyController(), MyController(), MyController()]

    override init(transitionStyle style: UIPageViewControllerTransitionStyle, navigationOrientation: UIPageViewControllerNavigationOrientation, options: [String : AnyObject]?) {
super.init(transitionStyle: .Scroll, navigationOrientation: .Horizontal, options: options)
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        if let firstVC = controllers.first {
            setViewControllers([firstVC], direction.Forward, animated: true, completion:nil)
        }    
    } 

    func pageViewController(pageViewController: UIPageViewController,
viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? {
        guard let viewControllerIndex = orderedViewControllers.indexOf(viewController) else {
            return nil
        }

        let previousIndex = viewControllerIndex - 1

        guard previousIndex >= 0 else {
            return nil
        }

        guard orderedViewControllers.count > previousIndex else {
            return nil
        }

        return orderedViewControllers[previousIndex]
     }

    func pageViewController(pageViewController: UIPageViewController,
viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {
        guard let viewControllerIndex = orderedViewControllers.indexOf(viewController) else {
            return nil
        }

        let nextIndex = viewControllerIndex + 1
        let orderedViewControllersCount = orderedViewControllers.count

        guard orderedViewControllersCount != nextIndex else {
            return nil
        }  

        guard orderedViewControllersCount > nextIndex else {
            return nil
        }

        return orderedViewControllers[nextIndex]
    }

 }

查看

class SmallView:UIView {
    //Since yours is not a ScrollView I changed to a view. You can add the Pan Gesture here. 
     var colors:[UIColor] = [UIColor.redColor(), UIColor.blueColor(), UIColor.blackColor()]

     convenience init(frame: CGRect, x:Int) {
         self.init()
         self.frame = frame
         self.backgroundColor = colors[x]

         setupGesture()
     }

     func setupGesture() {
         let pan = UIPanGestureRecognizer(target: self, action: #selector(SmallView.action))
     }
     func action(gesture:UIPanGestureRecognizer) {
         print("gesture = ", gesture)
     }
}

myController的

class MyController:UIViewController {

    override func viewDidLoad() {
        ......
        let view = SmallView(frame:CGRect(//some frame here))
        self.view.addSubview(view)
}
相关问题