首先是关闭UIPageViewController
在pageCurl
模式下的点击翻页.
获取UIPagecontroller里的手势, 并设置代理.
for gr in pageViewController.view?.gestureRecognizers ?? [] {
if gr.isKind(of: UITapGestureRecognizer.self) {
gr.delegate = self
}
}
添加手势代理
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
if gestureRecognizer.isKind(of: UITapGestureRecognizer.self) {
return false
}
return true
}
上面是可以取消pageCurl
模式下的点击翻页
另外一个问题是UIPageViewController
里是UITableView
的问题.
就是上下滑动UITableView
的时候, UIPageViewController
会自动执行这个数据源方法.
func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
if index <= 0 {
return nil
}
return viewController
}
没有任何动画效果,再往后翻页会出现空白页.
要解决这个问题可以把上面的手势代理设置改成下面这样, 也设置UIPanGestureRecognizer
的代理.
for gr in pageViewController.view?.gestureRecognizers ?? [] {
gr.delegate = self
}
但这样会导致另外一个问题, 就是在第一页和最后一页的时候再滑动, 如果数据源方法返回的控制器为nil
, 就会崩溃
要解决这个问题需要执行手势的另外一个代理方法.
func gestureRecognizerShouldBegin(_ gestureeRcognizer: UIGestureRecognizer) -> Bool {
//判断是否是 UIPanGestureRecognizer 手势
if gestureeRcognizer.isKind(of: UIPanGestureRecognizer.self) {
//获取手势滑动的偏移量
let translation = (gestureeRcognizer as! UIPanGestureRecognizer).translation(in: pageViewController.view)
if translation.x < 0 {
//如果是最后一页, 向左滑动的时候就
return false
} else {
//如果是第一页, 向右滑动的时候就
return false
}
if translation.y < 0 {
//向上滑动
} else {
//向下滑动
}
}
return true
}
这样就可以解决刚才的问题了.
网友评论