在 Readibility 第一次体验过这个控件,发现看文章的时候体验非常爽,看完一篇滑一下就可以返回到文章列表。后来网易新闻和新浪微博的 iPhone 客户端也引入了这个控件,于是我就想试试在 微淘 中加入这个手势试试。
图片来源 虽说加入这个控件是我的一时冲动,但分析一下我觉得还是有这个道理的。
图片来源 虽说加入这个控件是我的一时冲动,但分析一下我觉得还是有这个道理的。
- 很多人都是单手拿着 iPhone 来玩的,这是我在坐车和吃饭的时候看到很多人都这样玩而得到的经验。因此这就有左右手的区别了,然而一般的 app 都是非对称的,比如导航栏左边是个返回按钮,右边是个功能按钮。如果一个人用右手玩 app 的时候,很多时候都很难点击左上的按钮,特别是手指不够修成的女孩。
- iPhone 5 拿让人蛋痛的4寸屏。以前拿着来刷微博的时候就觉得按导航栏的按钮特别累(我手指已经比较修长了)。但是要我的拇指伸长到4寸来点击那个返回按钮,真是想把它甩了。
- 这个控件就是很 cool 。
- 继承 UINavigationController 的 pushViewController 方法做拓展
- 直接在 UIView 做这个事情
- 当前的 UIView
- 上一个页面的 UIView
- UINavigationController
@implementation UIViewController (ScreenShot)
-(UIImage*)generateScreenShot
{
CGSize size = [UIScreen mainScreen].bounds.size;
UIGraphicsBeginImageContextWithOptions(size,YES, 0.0);
[self.view.window.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
@end
有了这些东西,算法就很简单了,只要对 UIGestureRecognizerStateBegan, UIGestureRecognizerStateChanged, UIGestureRecognizerStateEnded 这几个手势状态来移动两个截图的相对位置就可以了,什么阴影,缩放的都可以随便加入。最后然UIViewController实现一个Delegate,用来检测时候应该弹出做popViewContrller的操作就可以了。
操作代码(不全):-(void)backGestureRecognized:(UIPanGestureRecognizer*)recognizer
{
if(_preView==nil) return;
if(recognizer.state == UIGestureRecognizerStateBegan)
{
[self endEditing:YES];
[self setLayout];
}
if (recognizer.state == UIGestureRecognizerStateBegan
|| recognizer.state == UIGestureRecognizerStateChanged) {
CGPoint point = [recognizer translationInView:self];
if(point.x>0){
[self setViewPosition:point];
}
} else if (recognizer.state == UIGestureRecognizerStateEnded) {
if(_currView.frame.origin.x > kBackGestureCommitLength){
//触发
[self moveOutSelfWithAnimation:YES];
}else{
//未触发
[self resetStateWithAnimation:YES];
}
}
}
源码地址
效果:
评论
发表评论