日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

重写 View 的 Touch 方法,实现一个酷炫的九宫格图片

發(fā)布時(shí)間:2025/7/14 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 重写 View 的 Touch 方法,实现一个酷炫的九宫格图片 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
前幾天翻看代碼庫,發(fā)現(xiàn)一個之前寫過的一個有意思的小玩意,共享給大家?
廢話不多說,上圖,先看看效果

photosView.gif

怎么樣,是不是還蠻有意思呢?

實(shí)現(xiàn)起來非常簡單,我們只需要重寫幾個 View 的 touch 方法

//觸摸開始 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ ? ?if ( [[[touches allObjects]lastObject] view]==self) {
? ? ? ?return;//這個地方demo里面沒有加判斷,可能會有崩潰現(xiàn)象,加上就好了
? ?} ? ?
? ?//獲取觸摸點(diǎn) ? ? UITouch *touch = [touches anyObject]; ? ?CGPoint point = [touch locationInView:self]; ? ?//當(dāng)前點(diǎn)擊到的圖片的下標(biāo)小于圖片數(shù)組的元素個數(shù) ? ? _selectIndex = [self itemIndexWithPoint:point]; ? ?if (_selectIndex < self.itemArray.count) { ? ? ? ?UIImageView *item = self.itemArray[_selectIndex]; ? ? ? ?//拿到最上層 ? ? ? ? [self bringSubviewToFront:item]; ? ? ? ?//動畫效果 ? ? ? ? [UIView animateWithDuration:0.3 animations:^{ ? ? ? ? ? ?//改變當(dāng)前選中圖片視圖的大小和位置 ? ? ? ? ? ? item.center = point; ? ? ? ? ? ? item.transform = CGAffineTransformMakeScale(1.2, 1.2); ? ? ? ? ? ? item.alpha = 0.8; ? ? ? ? }]; ? ? } ? }

在觸摸一開始,我們先判定當(dāng)前觸摸的點(diǎn)是在哪一張圖片上,獲得這張圖片的下標(biāo),并設(shè)置為選中下標(biāo),然后改變當(dāng)前圖片的位置(中心移動到觸摸點(diǎn))和大小(放大效果)。

//觸摸移動 - (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ ? ?//獲取觸摸點(diǎn) ? ? UITouch *touch = [touches anyObject]; ? ?CGPoint point = [touch locationInView:self]; ? ?//獲取當(dāng)前觸摸點(diǎn)位置下標(biāo) ? ? NSInteger index = [self itemIndexWithPoint:point]; ? ?if (_selectIndex < self.itemArray.count) { ? ? ? ?UIImageView *item = self.itemArray[_selectIndex]; ? ? ? ? item.center = point; ? ? ? ?if (index < self.itemArray.count && index != _selectIndex) { ? ? ? ? ? ?//當(dāng)前點(diǎn)位置所屬下標(biāo)與選中下標(biāo)不同 ? ? ? ? ? ? //將兩個圖片分別在數(shù)據(jù)源數(shù)組和子視圖數(shù)組中移除 ? ? ? ? ? ? UIImage *image = _dataList[_selectIndex]; ? ? ? ? ? ? [_dataList removeObjectAtIndex:_selectIndex]; ? ? ? ? ? ? [self.itemArray removeObjectAtIndex:_selectIndex]; ? ? ? ? ? ?//重新插入到指定位置 ? ? ? ? ? ? [_dataList insertObject:image atIndex:index]; ? ? ? ? ? ? [self.itemArray insertObject:item atIndex:index]; ? ? ? ? ? ?//重新記錄選中下標(biāo) ? ? ? ? ? ? _selectIndex = index; ? ? ? ? ? ?//重新布局 ? ? ? ? ? ? [self restartMakeItemFram]; ? ? ? ? } ? ? } ? }

然后在觸摸移動方法中再次判定當(dāng)前觸摸點(diǎn)所在的圖片下標(biāo),然后比較選中下標(biāo)與當(dāng)前下標(biāo),如果不相同,就交換兩張圖片的位置。

//觸摸結(jié)束 - (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ ? ?if (_selectIndex < _itemArray.count) { ? ? ? ?UIImageView *item = _itemArray[_selectIndex]; ? ? ? ?//還原操作 ? ? ? ? [UIView animateWithDuration:0.3 animations:^{ ? ? ? ? ? ? item.transform = CGAffineTransformIdentity; ? ? ? ? ? ? item.alpha = 1; ? ? ? ? ? ? item.frame = [self makeFrameWithIndex:(int)_selectIndex]; ? ? ? ? }]; ? ? } ? }

最后,在觸摸結(jié)束方法中還原選中圖片的大小,重新計(jì)算它的位置

是不是很簡單呢?下面附上 Demo 的地址
Demo點(diǎn)這里~點(diǎn)這里:https://github.com/li1024316925/PhotosView

?

文/i_have_an_Apple(簡書作者)
原文鏈接:http://www.jianshu.com/p/309cd2886e05
著作權(quán)歸作者所有,轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),并標(biāo)注“簡書作者”。

總結(jié)

以上是生活随笔為你收集整理的重写 View 的 Touch 方法,实现一个酷炫的九宫格图片的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。