iOS之UICollectionView的Item長按后抖動并且可移動效果

? ? ? 前段時間由于公司需求,恰好需要做一個CollectionView的Item長按后抖動并且可移動效果。但由于一些原因度陆,當(dāng)時并沒有來得及去處理,所以一直心有遺憾献幔。目前市場上此功能并不少見懂傀,而且在github上也有一些類似的開源代碼,所以其實(shí)總結(jié)來說:首先并不能作為一個功能難點(diǎn)蜡感,只能說是興趣至此蹬蚁;其次也是真心希望能幫助一些我能幫助的人,以及希望大家能給些建議郑兴。都說不想當(dāng)將軍的士兵不是好士兵犀斋,所以我覺得,不能溜溜的馬始終都是騾子...嘿嘿...回歸正題...(可以復(fù)制此鏈接瀏覽器下載demo? http://git.oschina.net/JHissuperman/CollectionView)

1.首先是UICollectionView的創(chuàng)建:

//創(chuàng)建一個layout布局類

UICollectionViewFlowLayout* layout = [[UICollectionViewFlowLayout alloc]init];

//設(shè)置布局方向?yàn)榇怪绷鞑季?/p>

layout.scrollDirection = UICollectionViewScrollDirectionVertical;

//設(shè)置每個item的大小為127.5*127.5

layout.itemSize = CGSizeMake(114*kWidth/750.00, 114*kWidth/750.00);

//整體view據(jù)上左下右距離

layout.sectionInset = UIEdgeInsetsMake(48*kWidth/750.00, 48*kWidth/750.00, 48*kWidth/750.00,48*kWidth/750.00);

//每個item上下距離

layout.minimumLineSpacing = 90*kWidth/750.00;

//每個item左右距離

layout.minimumInteritemSpacing = 66*kWidth/750.00;

//創(chuàng)建collectionView 通過一個布局策略layout來創(chuàng)建

_vibrate = [[UICollectionView alloc]initWithFrame:CGRectMake(0, 0*kWidth/750.00, kWidth, kHeight) collectionViewLayout:layout];

_vibrate.delegate = self;

_vibrate.dataSource = self;

_vibrate.backgroundColor = [UIColor lightGrayColor];

_vibrate.showsHorizontalScrollIndicator = NO;

_vibrate.showsVerticalScrollIndicator = NO;

_vibrate.userInteractionEnabled = YES;

//注冊item類型 這里使用系統(tǒng)的類型

[_vibrate registerClass:[VibrateCollectionViewCell class] forCellWithReuseIdentifier:@"vibrate"];

[self.view addSubview:_vibrate];

2.然后實(shí)現(xiàn)collectionview的代理方法:

//返回分區(qū)個數(shù)

-(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView{

return 1;

}

//返回每個分區(qū)的item個數(shù)

-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{

return _collectionArr.count;

}

//返回每個item

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{

VibrateCollectionViewCell * cell? = [collectionView dequeueReusableCellWithReuseIdentifier:@"vibrate" forIndexPath:indexPath];

//? ? [cell sizeToFit];

if(!cell){

NSLog(@"-----------");

}

NSInteger num = indexPath.row;

cell.nameLable.text = _collectionArr[num];

cell.headImageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"00%@",_collectionArr[num]]];

if(_isBegin == YES ){

[self starLongPress:cell];

}

return cell;

}

3.添加手勢

3.1? 抖動手勢的添加

- (void)addRecognize{

//添加長按抖動手勢

if(!_recognize){

_recognize = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPress:)];

}

//長按響應(yīng)時間

_recognize.minimumPressDuration = 1;

[_vibrate addGestureRecognizer:_recognize];

}

- (void)longPress:(UILongPressGestureRecognizer *)longGesture {

//判斷手勢狀態(tài)

switch (longGesture.state) {

case UIGestureRecognizerStateBegan:{

//判斷手勢落點(diǎn)位置是否在路徑上

NSIndexPath *indexPath = [self.vibrate indexPathForItemAtPoint:[longGesture locationInView:self.vibrate]];

if (indexPath.row >= 0) {//第一個不可移動? 個人限制

_isBegin = YES;

[_vibrate removeGestureRecognizer:_recognize];

[self addLongGesture];

[self addSureButton];

[_vibrate reloadData];

NSLog(@"1");

}else{

break;

}

}

break;

case UIGestureRecognizerStateChanged:{

NSLog(@"2");

break;

}

case UIGestureRecognizerStateEnded:

NSLog(@"3");

break;

default:

NSLog(@"4");

break;

}

}

//開始抖動

- (void)starLongPress:(VibrateCollectionViewCell*)cell{

CABasicAnimation *animation = (CABasicAnimation *)[cell.layer animationForKey:@"rotation"];

if (animation == nil) {

[self shakeImage:cell];

}else {

[self resume:cell];

}

}

//這個參數(shù)的理解比較復(fù)雜杈笔,我的理解是所在layer的時間與父layer的時間的相對速度闪水,為1時兩者速度一樣,為2那么父layer過了一秒蒙具,而所在layer過了兩秒(進(jìn)行兩秒動畫),為0則靜止球榆。

- (void)pause:(VibrateCollectionViewCell*)cell {

cell.layer.speed = 0.0;

}

- (void)resume:(VibrateCollectionViewCell*)cell {

cell.layer.speed = 1.0;

}

- (void)shakeImage:(VibrateCollectionViewCell*)cell {

//創(chuàng)建動畫對象,繞Z軸旋轉(zhuǎn)

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];

//設(shè)置屬性,周期時長

[animation setDuration:0.08];

//抖動角度

animation.fromValue = @(-M_1_PI/2);

animation.toValue = @(M_1_PI/2);

//重復(fù)次數(shù)禁筏,無限大

animation.repeatCount = HUGE_VAL;

//恢復(fù)原樣

animation.autoreverses = YES;

//錨點(diǎn)設(shè)置為圖片中心持钉,繞中心抖動

cell.layer.anchorPoint = CGPointMake(0.5, 0.5);

[cell.layer addAnimation:animation forKey:@"rotation"];

}

3.2 移動手勢的添加

- (void)addLongGesture{

//此處給其增加長按手勢,用此手勢觸發(fā)cell移動效果

if(!_longGesture){

_longGesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handlelongGesture:)];

}

_longGesture.minimumPressDuration = 0;

[_vibrate addGestureRecognizer:_longGesture];

}

//監(jiān)聽手勢篱昔,并設(shè)置其允許移動cell和交換資源

- (void)handlelongGesture:(UILongPressGestureRecognizer *)longGesture {

//判斷手勢狀態(tài)

switch (longGesture.state) {

case UIGestureRecognizerStateBegan:{

//判斷手勢落點(diǎn)位置是否在路徑上

NSIndexPath *indexPath = [self.vibrate indexPathForItemAtPoint:[longGesture locationInView:self.vibrate]];

if (indexPath.row > 0) {//第一個不可移動? 個人限制

[_vibrate beginInteractiveMovementForItemAtIndexPath:indexPath];

}else{

break;

}

}

break;

case UIGestureRecognizerStateChanged:{

NSIndexPath* indexPath = [_vibrate indexPathForItemAtPoint:[longGesture locationInView:_vibrate]];

if(indexPath.row<1){

break;//第一個不可移動? 個人限制

}

//移動過程當(dāng)中隨時更新cell位置

[_vibrate updateInteractiveMovementTargetPosition:[longGesture locationInView:_vibrate]];

break;

}

case UIGestureRecognizerStateEnded:

//移動結(jié)束后關(guān)閉cell移動

[_vibrate endInteractiveMovement];

break;

default:

[_vibrate endInteractiveMovement];

//? ? ? ? ? ? [_vibrate cancelInteractiveMovement];

break;

}

}

- (BOOL)collectionView:(UICollectionView *)collectionView canMoveItemAtIndexPath:(NSIndexPath *)indexPath{

return YES;

}

- (void)collectionView:(UICollectionView *)collectionView moveItemAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath*)destinationIndexPath {

//取出源item數(shù)據(jù)

id objc = [_collectionArr objectAtIndex:sourceIndexPath.item];

//從資源數(shù)組中移除該數(shù)據(jù)

[_collectionArr removeObject:objc];

//將數(shù)據(jù)插入到資源數(shù)組中的目標(biāo)位置上

[_collectionArr insertObject:objc atIndex:destinationIndexPath.item];

//? ? [_vibrate reloadData];

}

具體效果? 可以復(fù)制此鏈接瀏覽器下載demo? http://git.oschina.net/JHissuperman/CollectionView

希望能幫助到一些人每强,也希望大家能夠指正一些問題。請大家多多留言發(fā)表意見州刽。

(開源中國http://my.oschina.net/JHissuperman/blog/745064)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末空执,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子穗椅,更是在濱河造成了極大的恐慌辨绊,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件匹表,死亡現(xiàn)場離奇詭異门坷,居然都是意外死亡宣鄙,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進(jìn)店門默蚌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來冻晤,“玉大人,你說我怎么就攤上這事绸吸”腔。” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵惯裕,是天一觀的道長温数。 經(jīng)常有香客問我,道長蜻势,這世上最難降的妖魔是什么撑刺? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮握玛,結(jié)果婚禮上够傍,老公的妹妹穿的比我還像新娘。我一直安慰自己挠铲,他們只是感情好冕屯,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著拂苹,像睡著了一般安聘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上瓢棒,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天浴韭,我揣著相機(jī)與錄音,去河邊找鬼脯宿。 笑死念颈,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的连霉。 我是一名探鬼主播榴芳,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼跺撼!你這毒婦竟也來了窟感?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤歉井,失蹤者是張志新(化名)和其女友劉穎肌括,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡谍夭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了憨募。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片紧索。...
    茶點(diǎn)故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖菜谣,靈堂內(nèi)的尸體忽然破棺而出珠漂,到底是詐尸還是另有隱情,我是刑警寧澤尾膊,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布媳危,位于F島的核電站,受9級特大地震影響冈敛,放射性物質(zhì)發(fā)生泄漏待笑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一抓谴、第九天 我趴在偏房一處隱蔽的房頂上張望暮蹂。 院中可真熱鬧,春花似錦癌压、人聲如沸仰泻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽集侯。三九已至,卻和暖如春帜消,著一層夾襖步出監(jiān)牢的瞬間棠枉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工券犁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留术健,地道東北人。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓粘衬,卻偏偏與公主長得像荞估,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子稚新,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容