UIPageViewController中的边缘点击手势大概是屏幕的1/6,市面的大多数阅读器点击手势都在1/3以上,或者我干脆想自定义点击的范围,但又不想放弃系统的翻页效果,这时候该怎么做了?其实很简单,听我细细说来。

1.首先禁用UIPageViewController的tap手势(如果不禁用,会造成多次翻页)

可以创建UIPageViewController的分类,重写shouldReceiveTouch:方法即可

@implementation UIPageViewController (EnlargeTapRegion)

-(BOOL) gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
if ([gestureRecognizer isKindOfClass:[UITapGestureRecognizer class]]) {
return NO;
}
return YES;
} @end

2.自定义tap手势,实现touchReceiveTouch中的有效点击及响应的点击方法

- (void)tapSelf:(UIGestureRecognizer *)gesture {
NSLog(@"receive tap action !!!");
UIView *touchView = gesture.view;
CGPoint touchPoint = [gesture locationInView:touchView];
CGFloat viewWidth = CGRectGetWidth(touchView.frame);
if (touchPoint.x < viewWidth/3) {
_page -= 2;
UIViewController *preVC = [self previousVC];
BackPageViewController *backVC = [self backVCAt:[self previousVC]];
[self.pageVC setViewControllers:@[preVC,backVC] direction:UIPageViewControllerNavigationDirectionReverse animated:YES completion:nil];
}else if (touchPoint.x > viewWidth/3*2) {
_page += 2;
UIViewController *nextVC = [self nextVC];
BackPageViewController *backVC = [self backVCAt:[self nextVC]];
[self.pageVC setViewControllers:@[nextVC,backVC] direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:nil];
}
} - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
UIView *touchView = gestureRecognizer.view;
CGPoint touchPoint = [gestureRecognizer locationInView:touchView];
CGFloat viewWidth = CGRectGetWidth(touchView.frame);
if (gestureRecognizer == _weakTap) {
if (touchPoint.x < viewWidth/3 || touchPoint.x > viewWidth/3*2) {
return YES;
}
}
return NO;
}

  -shouldReceiveTouch方法中判断当前的触点X是否规定区域内,否则返回NO

   -tapSelf方法中根据触点位置判断翻页方向,使用pageViewController的方法setViewController:direction:方法实现手动跳转

    注意:使用这种方式跳转,不会常规走pageViewController的代理方法,需要自行处理数据的同步

pageviewController的双面模式实现,仅仅在pageCurl翻页模式下存在

1.设置doubleSide属性为YES

2.viewControllerBeforeViewController:及viewControllerAfterViewController代理方法中根据页面返回相应的控制器

-(UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController
{
_page -= 1;
if (_page % 2 == 1) {
return [self backVCAt:[self previousVC]];
}else {
return [self previousVC];
}
}
-(UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
{
_page += 1;
if (_page % 2 == 1) {
return [self backVCAt:[self nextVC]];
}else {
return [self nextVC];
}
}

3.当前视图的左右翻转透明显示

自定义控制器里面添加imageView,外界传入原本控制器或控制器视图,对该视图进行翻转绘制成图片赋给imageView

-(UIImage *)captureWithView:(UIView *)view
{
CGRect rect = view.bounds;
UIGraphicsBeginImageContextWithOptions(rect.size, YES, 0.0f);
CGContextRef context = UIGraphicsGetCurrentContext();
CGAffineTransform transform = CGAffineTransformMake(-1.0, 0.0, 0.0, 1.0, rect.size.width, 0.0);
CGContextConcatCTM(context, transform);
[view.layer renderInContext:context];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}

github 传送门

扩大UIPageViewController的点击范围的更多相关文章

  1. iOS 5 :一个UIPageViewController程序示例

    原文:http://www.techotopia.com/index.php/An_Example_iOS_5_iPhone_UIPageViewController_Application 在Xco ...

  2. 关于UIPageViewController去除边缘点击手势

    如果page上方还有一层UI控件的话,不去除边缘点击手势会造成手势的冲突干扰. 首先我做的处理是设置pageView的手势代理 for (UIGestureRecognizer *gr in _pag ...

  3. UIPageViewController跳跃切换的问题

    使用的是XHScrollMenu和UIPageViewController来构建5个页面: ViewController1, ViewController2, ViewController3, Vie ...

  4. 如何使用Storyboard创建UIPageViewController

    之前我们已经讲过UIPageViewController,那篇文章演示了如何使用Interface Builder创建UIPageViewController.为了适配iOS7和Xcode5,我们重新 ...

  5. swift:简单使用翻页控制器UIPageViewController

    一.小叙 UIPageViewController是一个实现图书阅读的控制器,使用它可以设置书脊位置.单双页.过渡效果等,它是通过代理的方式来实现翻页,也即上一页.下一页.最终这个UIPageView ...

  6. a标签点击跳转失效--IE6、7的奇葩bug

    一般运用a标签包含img去实现点击图片跳转的功能,这是前端经常要用到的东西. 今天遇到个神奇的bug:如果在img上再包裹一层div,而且div设置了width和height,则图片区域点击时,无任何 ...

  7. Jquery的点击事件,三句代码完成全选事件

    先来看一下Js和Jquery的点击事件 举两个简单的例子 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&q ...

  8. 移动端IOS点击事件失效解决方案

    解决方案 解决办法有 4 种可供选择: 1 将 click 事件直接绑定到目标元素(即 .target)上 2 将目标元素换成 <a> 或者 button 等可点击的元素 3 将 clic ...

  9. Android笔记——Button点击事件几种写法

    Button点击事件:大概可以分为以下几种: 匿名内部类 定义内部类,实现OnClickListener接口 定义的构造方法 用Activity实现OnClickListener接口 指定Button ...

随机推荐

  1. 【JDK命令行 一】手动编译Java源码与执行字节码命令合集(含外部依赖引用)

    写作目标 记录常见的使用javac手动编译Java源码和java手动执行字节码的命令,一方面用于应对 Maven 和 Gradle 暂时无法使用的情况,临时生成class文件(使用自己的jar包):另 ...

  2. 新晋总监生存指南三——OKR

    一.什么是OKR 书接上文:新晋总监生存指南二--建立指标 OKR在我们团队正循环大图中占有很重的分量,好的OKR实践同时也是上文中数据指标实践的案例.反向论述可以认为,数据指标建设混乱的团队很难运用 ...

  3. .Net RabbitMQ实战指南——RabbitMQ相关概念介绍

    什么是消息中间件 消息(Message)是指在应用间传送的数据.消息可以非常简单,比如只包含文本字符串.JSON等,也可以很复杂,比如内嵌对象. 消息队列中间件(Message Queue Middl ...

  4. HTML <a> 标签的 href 属性

    w3school页面的描述: HTML <a> 标签的 href 属性 HTML <a> 标签 实例 href 属性规定链接的目标: <a href="http ...

  5. Python 应用领域以及版本之间的区别

    Python 应用领域以及版本之间的区别 一.Python应用领域 1. Python+人工智能,给你更多研究方向选择! 2. 企业级综合实战项目,集六大前沿技术为一体 二. Python 2与Pyt ...

  6. MapReduce——客户端提交任务源码分析

    计算向数据移动 MR程序并不会在客户端执行任何的计算操作,它是为计算工作做好准备,例如计算出切片信息,直接影响到Map任务的并行度. 在Driver中提交任务时,会写到这样的语句: boolean r ...

  7. 十一、diff和patch打补丁

    diff制作补丁文件的原理:告诉我们怎么修改第一个文件后能得到第二个文件. diff命令常用选项: -u 输出统一内容的头部信息(打补丁使用),计算机知道是哪个文件需要修改    -r 递归对比目录中 ...

  8. 十七、.net core(.NET 6)搭建基于Quartz组件的定时调度任务

     搭建基于Quartz组件的定时调度任务 先在package包项目下,添加Quartz定时器组件: 新建类库项目Wsk.Core.QuartzNet,并且引用包类库项目.然后新建一个中间调度类,叫Qu ...

  9. Java编程技巧:if-else优化实践总结归纳

    文/朱季谦 说实话,其实我很讨厌在代码里大量使用if-else,一是因为该类代码属于面向过程的,二嘛,则是会显得代码过于冗余.这篇笔记,主要记录一些自己在工作实践当中针对if-else的优化心得,将会 ...

  10. Linux命令大全之搜索命令

    文件搜索命令(只能搜索文件) locate 文件名 在后台数据库中按文件名搜索,搜索速度快      /var/lib/mlocate(locate文件数据库)    这个数据库默认一天更新一次,强制 ...