闲扯
书到用时方恨少,事非经过不知难。
------陆游
最近闲来无事,着手写一些UI类的效果,那么就拿图片浏览器开刀吧。对着别人的开源项目,依葫芦画个瓢😂。
参考资料
自己练习的demo
demo效果
☺.gifdemo笔记
首先是基于 UICollectionView 嵌套 UIScrollView 去实现的(这种嵌套引发的手势问题简直不能再多再烂了 ),那又怎样我还是要说 :P
问题:
有两个:
1.UICollectionViewCell 中嵌套 UIScrollView ,导致
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath;
代理方法不会响应
2.在照片展示界面:添加的拖拽手势 panGesture 会与collectionView 滑动手势产生手势冲突,导致无法翻页。
解决方法:
1>针对第一个问题,出现的原因:UIScrollView 拦截了这次点击事件。
so ~~~,有两种解决方法
PLAN A:
将scrollView的 userInteractionEnabled
属性设置为 NO , 把scrollView 的交互性关闭,这样点击的回调就可以触发了。但是这种做法并不好(根据需求来说),因为scrollView 是用来做交互的(图片的捏合,缩放操作),把交互性关掉只是拆东墙补西墙的做法,还是要考虑需求来进行使用。
PLAN B:
给 UICollectionViewCell 添加点击手势 :P,我实在是没有太好的方法/(ㄒoㄒ)/~~
PS:这是我能想到的两种方法,如果有更好的办法,请告诉我🙏🙏🙏。
2> 那么第二个问题 ,出现的原因:pan 手势 拦截了 UICollectionView 的滑动手势。知道了原因,就可以进行对症下药。
解决方法:根据手势的滑动方向,如果是上下滑动则允许触发pan手势,做动画处理;如果是左右滑动,那么就禁掉 pan 手势。(我是根据水平竖直的滑动速度,来判断手指的滑动方向的🤣)
so,实现gesture 的这个代理方法就可以了:
- (BOOL)gestureRecognizerShouldBegin:(UIPanGestureRecognizer *)gestureRecognizer{
//如果不是pan 手势,那么直接返回
if (![gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]) return YES;
// 判断是否是长图
if (self.scrollView.contentSize.height > self.contentView.bounds.size.height) {
return NO;
}
//判断滑动方向
CGPoint velocity = [gestureRecognizer velocityInView:self.contentView];
// 如果是左右滑动,不在响应拖拽手势;如果是上下滑动,就响应拖拽的手势
if (fabs(velocity.x) > fabs(velocity.y)){
return NO;
}else{
return YES;
}
}
PS:学习的脚步未敢停止 💪 :P
网友评论