扩大UIPageViewController的点击范围
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;
}
扩大UIPageViewController的点击范围的更多相关文章
- iOS 5 :一个UIPageViewController程序示例
原文:http://www.techotopia.com/index.php/An_Example_iOS_5_iPhone_UIPageViewController_Application 在Xco ...
- 关于UIPageViewController去除边缘点击手势
如果page上方还有一层UI控件的话,不去除边缘点击手势会造成手势的冲突干扰. 首先我做的处理是设置pageView的手势代理 for (UIGestureRecognizer *gr in _pag ...
- UIPageViewController跳跃切换的问题
使用的是XHScrollMenu和UIPageViewController来构建5个页面: ViewController1, ViewController2, ViewController3, Vie ...
- 如何使用Storyboard创建UIPageViewController
之前我们已经讲过UIPageViewController,那篇文章演示了如何使用Interface Builder创建UIPageViewController.为了适配iOS7和Xcode5,我们重新 ...
- swift:简单使用翻页控制器UIPageViewController
一.小叙 UIPageViewController是一个实现图书阅读的控制器,使用它可以设置书脊位置.单双页.过渡效果等,它是通过代理的方式来实现翻页,也即上一页.下一页.最终这个UIPageView ...
- a标签点击跳转失效--IE6、7的奇葩bug
一般运用a标签包含img去实现点击图片跳转的功能,这是前端经常要用到的东西. 今天遇到个神奇的bug:如果在img上再包裹一层div,而且div设置了width和height,则图片区域点击时,无任何 ...
- Jquery的点击事件,三句代码完成全选事件
先来看一下Js和Jquery的点击事件 举两个简单的例子 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&q ...
- 移动端IOS点击事件失效解决方案
解决方案 解决办法有 4 种可供选择: 1 将 click 事件直接绑定到目标元素(即 .target)上 2 将目标元素换成 <a> 或者 button 等可点击的元素 3 将 clic ...
- Android笔记——Button点击事件几种写法
Button点击事件:大概可以分为以下几种: 匿名内部类 定义内部类,实现OnClickListener接口 定义的构造方法 用Activity实现OnClickListener接口 指定Button ...
随机推荐
- 彻底弄懂HTTP缓存机制及原理【转载】
前言 Http 缓存机制作为 web 性能优化的重要手段,对于从事 Web 开发的同学们来说,应该是知识体系库中的一个基础环节,同时对于有志成为前端架构师的同学来说是必备的知识技能.但是对于很多前端同 ...
- SpringMVC=>解决JSON乱码问题
<!-- 解决JSON乱码问题 --> <mvc:annotation-driven> <mvc:message-converters register-defaults ...
- Python+Selenium - iframe定位
元素在iframe中.在html当中,内嵌了另一个html (iframe) 分辨元素是否在iframe当中 在代码当中,从当前的html切换到iframe当中的html,然后在元素定位 切换方式:d ...
- 深入探索Glide图片加载框架:做了哪些优化?如何管理生命周期?怎么做大图加载?
前言 Glide可以说是最常用的图片加载框架了,Glide链式调用使用方便,性能上也可以满足大多数场景的使用,Glide源码与原理也是面试中的常客. 但是Glide的源码内容比较多,想要学习它的源码往 ...
- 视觉SLAM的主要功能模块分析
视觉SLAM的主要功能模块分析 一.基本概念 SLAM (simultaneous localization and mapping),也称为CML (Concurrent Mapping and L ...
- ISP算法高水平分析(上)
ISP算法高水平分析(上) 一.ISP基本框架及算法介绍 ISP是Image Signal Processor的缩写,全称是影像处理器.在相机成像的整个环节中,它负责接收感光元件(Sensor)的原始 ...
- CSS 常见问题笔记
CSS 常见问题 布局 一.盒模型宽度计算 问题:div1 的 offsetWidth 是多少? <style> #div1 { width: 100px; padding: 10px; ...
- .NET平台系列14 .NET5中的新增功能
系列目录 [已更新最新开发文章,点击查看详细] .NET5中不包含的内容 尽管 .NET5 框架中提供了一组重要 API,但它并不包括过去20年左右开发的所有 API,但是.NET Stand ...
- 用 Flutter 和 Firebase 轻松构建 Web 应用
作者 / Very Good Ventures Team 我们 (Very Good Ventures 团队) 与 Google 合作,在今年的 Google I/O 大会上推出了 照相亭互动体验 ( ...
- [源码解析] 深度学习分布式训练框架 horovod (3) --- Horovodrun背后做了什么
[源码解析] 深度学习分布式训练框架 horovod (3) --- Horovodrun背后做了什么 目录 [源码解析] 深度学习分布式训练框架 horovod (3) --- Horovodrun ...