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

用Swift封装图片折叠效果

boyXiong

谈到封装,那么就要从使用者的角度出发,提供外界使用的方法

  • 1.新建一个类继承UIView

    class XWFoldImageView: UIView {}
  • 2.外界想实现这个效果只需要给我图片名和控件显示的frame就够了,那么提供使用者遍历构造方法
    convenience init(imageName:String ,frame:CGRect){
    self.init()
    self.frame = frame //1.在初始化做的操作
    self.setupDoubleImageViewLayer(imageName)
    self.setupGestureRecognizer()
    }
  • 3那么外界使用就是非常方便,如:

    override func viewDidLoad() {  super.viewDidLoad()
    let foldImageView = XWFoldImageView(imageName: "image", frame: CGRectMake(50, 100, 300, 200))
    self.view.addSubview(foldImageView)
    }

谈谈如何具体实现 + 大体思想

1.利用两张一模一样的图片,放在同一个UIView上面分了顶部和底部

这里写图片描述

具体代码

    //MARK: 成员属性
private var imageTopView:UIImageView!
private var imageBottomView:UIImageView!
private var gradientLayer:CAGradientLayer = CAGradientLayer() //MARK: 便利构造 convenience init(imageName:String ,frame:CGRect){
self.init()
self.frame = frame
self.setupDoubleImageViewLayer(imageName)
self.setupGestureRecognizer()
} //MARK: 设置图片图层的描点和 postion
private func setupDoubleImageViewLayer(imageName:String){ //1添加到父控件
let imageBottomView = UIImageView(image: UIImage(named: imageName))
imageBottomView.frame = self.bounds
imageBottomView.contentMode = UIViewContentMode.ScaleToFill
self.addSubview(imageBottomView)
self.imageBottomView = imageBottomView let imageTopView = UIImageView(image: UIImage(named: imageName))
imageTopView.frame = self.bounds
imageTopView.contentMode = UIViewContentMode.ScaleToFill
self.addSubview(imageTopView)
self.imageTopView = imageTopView //2.设置contents显示比例
self.imageTopView.layer.contentsRect = CGRectMake(0, 0, 1, 0.5)
self.imageBottomView.layer.contentsRect = CGRectMake(0, 0.5, 1, 0.5) //2.1设置锚点
/** 两张图,各显示一半,让描点为中间的点,这样才可以用tranfrom 描点就是,在将自己图层的具体坐标点,按照width height 比例计算出x,y 显示到 position那个点上面去,整个图也就跟着动了,旋转是跟着锚点旋转的
*/
self.imageTopView.layer.anchorPoint = CGPointMake(0.5, 1)
self.imageBottomView.layer.anchorPoint = CGPointMake(0.5, 0) //3.修改图层坐标点,修改postion 其实就是center,改了之后center也跟着改了
self.imageTopView.layer.position = CGPointMake(self.imageTopView.center.x, self.imageTopView.center.y + self.imageTopView.height * 0.5)
//3.1 虽然修改了图层的contentsRect 但是本身的高度并没有修改,导致旋转的时候,高度变高
self.imageTopView.height = self.height * 0.5 //3.2 设置底图的postion 但是不用设置实际高,因为不需要形变
self.imageBottomView.height = self.height * 0.5 //4 给图层增加一个阴影层
self.gradientLayer.frame = self.imageBottomView.bounds
//4.1渐变的颜色
self.gradientLayer.colors = [UIColor .clearColor().CGColor, UIColor.blackColor().CGColor]
//不透明度
self.gradientLayer.opacity = 0 self.imageBottomView.layer.addSublayer(self.gradientLayer) }

2.给父控件添加手势,来改变子控件图层的形变

这里写图片描述

具体代码

//MARK: 添加手势拖拽
private func setupGestureRecognizer(){
//1.
let pan = UIPanGestureRecognizer(target: self, action: "panFunc:") self.addGestureRecognizer(pan)
} //MARK: 手势执行 func panFunc(pan:UIPanGestureRecognizer){ //1.得到偏移量,就是x,y坐标与 左上角CGPointZero 的差距
let offSet = pan.translationInView(pan.view) print(offSet) //2.得到旋转的角度
var angle = -kAngle2Radian(offSet.y) * 5 //3.如果大于角度就固定最刚好遮盖值
if fabs(angle) >= kAngle2Radian(340) * 5 { angle = angle / angle * kAngle2Radian(346) * 5
} //增强立体感
var transfrom:CATransform3D = CATransform3DIdentity
// d:人的眼睛和屏幕的垂直距离
let d:CGFloat = 300
// 设置形变的m34就可以增加立体感,立体感(近大远小)
transfrom.m34 = -1 / d //2.根据 y 值的大小进行旋转X轴的角度
transfrom = CATransform3DRotate(transfrom, angle, 1, 0, 0) self.imageTopView.layer.transform = transfrom //2.1设置阴影
self.gradientLayer.opacity = Float(fabs(angle) / (kAngle2Radian(346) * 4.0)) //3.检查用户抬起手势
if pan.state == UIGestureRecognizerState.Ended { UIView.animateWithDuration(0.5, delay: 0, usingSpringWithDamping: 0.1, initialSpringVelocity: 0, options: UIViewAnimationOptions.CurveEaseInOut, animations: { () -> Void in self.imageTopView.layer.transform = CATransform3DIdentity self.gradientLayer.opacity = 0; }, completion: { (Bool) -> Void in }) } }

通过这个思想,通过捆绑式控件,让父控件响应用户交互,然后控制子控件形变,来实现复杂的UI动画效果比继承UIControl,来完成复杂的自定义控件操作,应该容易点

Swift 2.0 封装图片折叠效果的更多相关文章

  1. iOS图片折叠效果:Layer的contentsRect属性和渐变层

    http://www.cocoachina.com/ios/20150722/12622.html 作者:@吖了个峥 授权本站转载. 前言 此次文章,讲述的是Layer的一个属性contentsRec ...

  2. thinkphp5.0 实现图片验证效果且能点击图片刷新图片

    思路与文件上传相同,只是验证码一个方法: <img src="{:captcha_src()}" /> 后台文件:app\ceshi\yam <?php name ...

  3. Core Animation一些Demo总结 (动态切换图片、大转盘、图片折叠、进度条等动画效果)

    前一篇总结了Core Animation的一些基础知识,这一篇主要是Core Animation 的一些应用,涉及到CAShapeLayer.CAReplicatorLayer等图层的知识. 先看效果 ...

  4. iOS开发——UI进阶篇(十八)核心动画小例子,转盘(裁剪图片、自定义按钮、旋转)图片折叠、音量震动条、倒影、粒子效果

    一.转盘(裁剪图片.自定义按钮.旋转) 1.裁剪图片 将一张大图片裁剪为多张 // CGImageCreateWithImageInRect:用来裁剪图片 // image:需要裁剪的图片 // re ...

  5. 淡入淡出(折叠效果)and点击切换背景图片

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. Android仿掌上英雄联盟首页,实现折叠效果

    概述 仿掌上英雄联盟首页的demo 详细 代码下载:http://www.demodashi.com/demo/10695.html 首页大概分为几个部分 状态栏 标题栏 轮播图 切换的Tab 资讯列 ...

  7. BootStrap入门教程 (四) :JQuery类库插件(模态窗口,滚动监控,标签效果,提示效果,“泡芙”效果,警告区域,折叠效果,旋转木马,输入提示)

    上讲回顾:Bootstrap组件丰富同时具有良好可扩展性,能够很好地应用在生产环境.这些组件包括按钮(Button),导航(Navigation),缩略图( thumbnails),提醒(Alert) ...

  8. JS实现图片''推拉门''效果

    JS实现图片''推拉门''效果   ''推拉门''动效也可以称作"手风琴"效果,大多数效果实现的思路基本是一样的,下面介绍两种方法,一种是通过改变图片的偏移位置实现移动,另一种是通 ...

  9. 仿FLASH的图片轮换效果

    css布局代码(test.css): body { background: #ccc;} ul { padding: 0; margin: 0;} li { list-style: none;} im ...

随机推荐

  1. CSS选择器列表

    h1 类型选择器 选择元素的一个类型 .className 类选择器 以class属性的值来选择元素,可以在一个页面中出现多个 #idName ID选择器 以id属性的值来选择元素,在页面中是唯一的, ...

  2. The type or namespace name 'Script' does not exist in the namespace 'System.Web' (are you missing an assembly reference?)

    应该说是 .net4 的bug,没有所谓的 System.Web.Extensions.dll 库文件,需要将项目的 Target Framework修改为 3.5版本,才能加载System.Web. ...

  3. java线层的使用

    class Do3 { public static void main(String[] args) { XC d1=new XC("小王"); XC d2=new XC(&quo ...

  4. h5标签canvas关于getImageData跨域的问题

    h5标签canvas关于getImageData跨域的问题 在学习h5的时候,canvas标签中getImageData()报错:security error! 具体代码如下(chrome浏览器): ...

  5. 闭包中的 this 对象

    关于this对象 在闭包中使用this对象也可能会导致一些问题.this对象是在运行时基于函数的执行环境绑定的:在全局函数中,this等于window, function createFunction ...

  6. Java system.getproperty获取环境属性

    序号 属性 说明 1 java.version Java 运行时环境版本 2 java.vendor Java 运行时环境供应商 3 java.vendor.url Java 供应商的 URL 4 j ...

  7. poj1981 Circle and Points 单位圆覆盖问题

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud Circle and Points Time Limit: 5000MS   Me ...

  8. Objective-C中的copy协议

    NSObject对象是否可以copy自己 NSObject类没有实现NSCopying或者NSMutableCopying协议,但是却有copy以及mutableCopy实例方法.然而,如果用NSOb ...

  9. SpringMVC项目中中文字符乱码问题及解决办法总结(非专业最优解决办法) -- ajax传值乱码; request.getParameter()乱码;

    情况一: ajax中传值时是乱码(后台可以获取到中文字符,但用@ResponseBody返回时前台为乱码) 情况二: Controller 中 request.getParameter()获取到的是乱 ...

  10. js函数的各种写法与调用

    以下是我见过的各种js函数的各种写法以及调用,虽然有些写法及其调用我不清楚其专业术语叫啥,但并不影响我写一个总结笔记. 我们刚开始接触js语音,经常看到的这种名叫“使用function关键字来定义函数 ...