iOS Collection View 编程指导(四)-添加手势

你可以给collectionView添加手势来提高collectionView的可交互性. 给collectionView添加某种手势, 当用触发该手势时, 会触发collectionView的一个动作. 对于collectionView来说这里有两类动作需要绑定一个手势:

  • 你想触发一个collectionView的layout更新动作
  • 你想直接操作cell或者view

你应该将手势添加到collectionView而不是某个特定的cell或view. 因为UICollectionViewUIScrollView的子类, 因此将一个手势添加到collectionView上会减少对其他手势的干扰. 另外, 因为collectionView可以访问DataSource和layout对象, 所以当你给collectionView加上手势时, 你就能获取cell和view的各种信息.

使用手势来修改layout信息


手势提供了一种修改layout对象的便捷方式. 举个例子, 你可能会使用pinch手势来修改item的间距(在自定义布局情况下). 其步骤比较简单, 如下:

  • 创建一个手势
  • 将创建好的手势添加到collectionView中
  • 在手势的Handler方法中做你想要的操作, 比如更新layout的属性, 更新layout对象

创建手势使用常规方法就行(alloc/init), 使用addGestureRecognizer:方法将手势添加到collectionView中, 设置手势的target, 将action方法实现好(主要部分).

代码清单4-1展示了pinch手势的action, 在action方法中修改自定义的layout, 然后通知系统更新layout对象. 其中的updateSpreadDistance方法是用来修改layout的某些参数的, 最后调用layout对象的invalidateLayout方法,通知系统更新collectionView的layout.

代码清单4-1 使用手势来更新layout

- (void)handlePinchGesture:(UIPinchGestureRecognizer *)sender {
    if ([sender numberOfTouches] != 2)
        return;
 
   // Get the pinch points.
   CGPoint p1 = [sender locationOfTouch:0 inView:[self collectionView]];
   CGPoint p2 = [sender locationOfTouch:1 inView:[self collectionView]];
 
   // Compute the new spread distance.
    CGFloat xd = p1.x - p2.x;
    CGFloat yd = p1.y - p2.y;
    CGFloat distance = sqrt(xd*xd + yd*yd);
 
   // Update the custom layout parameter and invalidate.
   MyCustomLayout* myLayout = (MyCustomLayout*)[[self collectionView] collectionViewLayout];
   [myLayout updateSpreadDistance:distance];
   [myLayout invalidateLayout];
}

想知道更多关于手势创建/添加到view的知识, 请看Event Handling Guide for iOS.

collectionView自带手势


  • UICollectionView能够监听单击手势来触发delegate的高亮/选中方法. 如果你自定义的一个tap或者长按手势添加到collectionView中, 你要注意将自定义的手势和自带的区分开来, 你自定义手势的gesture recognizer对象的某些值需要区别设置, 比如, 你自定义tap手势的只响应双击(double-taps)
  • 代码清单4-2展示了用自定义的手势替换自带手势(highlight/selection). 你可以将自定义手势的delaysTouchesBegan设置为YES, 这样会使自定义手势优先自带手势被处理, 也可以设置cancelsTouchesInView为YES来排他手势.

代码清单4-2 提高自定义手势的优先级

UITapGestureRecognizer* tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapGesture:)];
tapGesture.delaysTouchesBegan = YES;
tapGesture.numberOfTapsRequired = 2;
[self.collectionView addGestureRecognizer:tapGesture];

直接操作Cells和Views


如何使用手势来操作cell和view, 取决于你打算做何种操作. 简单的插入/删除操作, 可以使用标准的手势来处理. 但是要做一些复杂的操作时, 需要定义自己的手势, 按照touch事件来处理.

这里有一种操作需要用到自定义手势, 这种操作是:你将一个cell从一个位置移动另外一个位置. 最直接的方式是先cell从初始位置删除, 使用手势拖动删除的cell, 再将该cell插入的目的位置. 该过程需要用到touch事件, layout对象和DataSource.

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,366评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,521评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,689评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,925评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,942评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,727评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,447评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,349评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,820评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,990评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,127评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,812评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,471评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,017评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,142评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,388评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,066评论 2 355

推荐阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明先生_X自主阅读 15,982评论 3 119
  • 每个CollectionView都需要一个DataSource对象. DataSource对象是内容提供者. 它可...
    陵无山阅读 2,018评论 0 3
  • 有人说距离太近 成为不知所措的习惯 一种消极的负累 如果距离产生美 是因你我不够美好 任性变成了刺猬 经与纬是否需...
    白咖啡鐘文萍阅读 264评论 2 6
  • 陌上仙姝入眼花, 一枝一叶一春芽。 倾情甫就华章好, 雅趣天成是大家。 (感谢文友包子题诗,2017.4.3)
    一剪红梅阅读 351评论 2 4
  • 时间像一股风吹走了太多的过往, 吹走了我的童年和儿时的梦想, 长大了的我再也没有那时的狂妄, 只有冷冰冰的世界让我...
    兔子1947阅读 225评论 0 0