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

前几天翻看代码库,发现一个之前写过的一个有意思的小玩意,共享给大家??
废话不多说,上图,先看看效果

photosView.gif

怎么样,是不是还蛮有意思呢?

实现起来非常简单,我们只需要重写几个 View 的 touch 方法

//触摸开始
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{    
    if ( [[[touches allObjects]lastObject] view]==self) {         return;//这个地方demo里面没有加判断,可能会有崩溃现象,加上就好了    }        //获取触摸点    
    UITouch *touch = [touches anyObject];    
    CGPoint point = [touch locationInView:self];    
    //当前点击到的图片的下标小于图片数组的元素个数    
    _selectIndex = [self itemIndexWithPoint:point];    
    if (_selectIndex < self.itemArray.count) {        
        UIImageView *item = self.itemArray[_selectIndex];        
        //拿到最上层        
        [self bringSubviewToFront:item];        //动画效果        
        [UIView animateWithDuration:0.3 animations:^{            
            //改变当前选中图片视图的大小和位置            
            item.center = point;            
            item.transform = CGAffineTransformMakeScale(1.2, 1.2);            
            item.alpha = 0.8;        
        }];    
    }  
}

在触摸一开始,我们先判定当前触摸的点是在哪一张图片上,获得这张图片的下标,并设置为选中下标,然后改变当前图片的位置(中心移动到触摸点)和大小(放大效果)。

//触摸移动
- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{    
    //获取触摸点    
    UITouch *touch = [touches anyObject];    
    CGPoint point = [touch locationInView:self];    
    //获取当前触摸点位置下标    
    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) {            
            //当前点位置所属下标与选中下标不同            
            //将两个图片分别在数据源数组和子视图数组中移除            
            UIImage *image = _dataList[_selectIndex];            
            [_dataList removeObjectAtIndex:_selectIndex];            
            [self.itemArray removeObjectAtIndex:_selectIndex];            
            //重新插入到指定位置            
            [_dataList insertObject:image atIndex:index];            
            [self.itemArray insertObject:item atIndex:index];            
            //重新记录选中下标            
            _selectIndex = index;            
            //重新布局            
            [self restartMakeItemFram];        
         }    
    }  
}

然后在触摸移动方法中再次判定当前触摸点所在的图片下标,然后比较选中下标与当前下标,如果不相同,就交换两张图片的位置。

//触摸结束
- (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];        
         }];    
    }  
}

最后,在触摸结束方法中还原选中图片的大小,重新计算它的位置

是不是很简单呢?下面附上 Demo 的地址
Demo点这里~点这里:https://github.com/li1024316925/PhotosView

文/i_have_an_Apple(简书作者)
原文链接:http://www.jianshu.com/p/309cd2886e05
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

时间: 2024-11-13 23:14:22

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

一个酷炫的,基于HTML5,Jquery和Css的全屏焦点图特效,兼容各种浏览器

基于HTML5和CSS的焦点图特效,梅花图案的背景很有中国特色,而且还会动哦,效果超炫,推荐下载! 演示图 html代码 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 2 <html xmlns="http://www.w3.org/199

Android之——史上最简单最酷炫的3D图片浏览效果的实现

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/48052709 如今,Android开发已经成为移动互联开发领域中一支不可或缺的力量,那么Android中要实现3D的效果那也就是合情合理的事情了.那么,如何在Android中实现像IOS中那样的3D图片浏览效果呢?下面,鄙人将重磅推出今天的重点博文,和大家一起在Android中实现酷炫的3D图片浏览效果. 一.原理 老规矩,还是要来啰嗦下原理的东西. 整体实现是以手机屏幕的正中间

【Android】 给我一个Path,还你一个酷炫动画

本篇文章已授权微信公众号 hongyangAndroid (鸿洋)独家公布 转载请标明出处: http://blog.csdn.net/zxt0601/article/details/53040506 本文出自:[张旭童的CSDN](http://blog.csdn.net/zxt0601) 代码传送门:喜欢的话.随手点个star.多谢 https://github.com/mcxtzhang/PathAnimView 一 概述 原本仅仅是想模仿一下我魂牵梦萦的StoreHouse效果.没想到意

用vue做一个酷炫的menu

写在前面 最近看到一个非常酷炫的menu插件,一直想把它鼓捣成vue形式,谁让我是vue的死灰粉呢,如果这都不算爱??.??开个小玩耍,我们一起来探索黑魔法吧.观看本教程的读者需要具备一定的vue和css3的知识. 本文结构 1.效果演示 2.使用方法介绍 3.关键步骤讲解 正文 1.效果演示 在线演示live demo 2.使用介绍 项目地址:github.com/MingSeng-W/vue-bloom-menu,clone项目到本地 a. 首先在单文件组件里引入menu组件,导入commo

IDEA系列(七)--给自己的IDEA一个酷炫的主题吧

跟eclipse和MyEclipse一样,先找个自己喜欢的主题.http://www.riaway.com/ 1.导入主题: file-->import Setting-->选择自己主题所在位置 2.重启idea:点击ok,idea将会restrat 3.应用主题:file--setting--Editor--Color Scheme--选择自己的主题--apply 4.发现默认字体好小,还不好看,长得丑,换一个吧:file--setting(也可以用快捷键ctrl+alt+s,直接进入set

分享一个酷炫动态登录页面html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD> <TITLE> 叶子 </TITLE> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <META NAME="Ge

【注释张豪华版 Path酷炫动画】极速get花式Path (支付宝支付成功动画)

转载请标明出处: http://blog.csdn.net/zxt0601/article/details/54018970 本文出自:[张旭童的博客](http://blog.csdn.net/zxt0601) 代码传送门:喜欢的话,随手点个star.多谢 https://github.com/mcxtzhang/PathAnimView 概述 新年第一篇技术文章哈,大家新年快乐,先来个简单点的,主要介绍工具的使用,预预热,下周一奉上一个骚气的购物车动画按钮,敬请期待. 在前文 给我一个Pat

LINUX(UBUNTU)下的酷炫终端

网上看了一篇老外的文章,是在MAC下利用iTerm2+zsh+Powerlevel9k+Nerd Fonts 搞出来的酷炫终端,图片是这样的:是不是第一眼觉得高.大.上,第二眼觉得看上去有点晕.如果你保持这种第一眼的认知,而苦于没有没有MAC,我告诉你,其实LINUX也能做出类似的效果 实验利用UBUNTU+XSHELL终端实现(理论上其它发行版也可以) 1.安装zsh linux发行版大部分默认SHELL都是bash,而不是zsh,所以第一步安装zsh [email protected]:~$

酷炫字体背景图的实现——神奇的background-clip: text

愉快的时光总是飞快,七天小长假已接近尾声,抓住假期的尾巴,再学个新知识点--css的background-clip: text属性...会不会有种陌生的感觉,毕竟在我们的印象里,background-clip只有padding-box.border-box.content-box三个属性,这个text是个什么鬼???没用过没关系,今天就来看看它用什么妙用... background-clip的定义:规定背景的绘制区域:简而言之,background-clip就是规定background-colo