Swift教程_零基础学习Swift完整实例(八)_swift完整实例(添加View的动画效果、添加View的阴影)

6.添加View的动画效果

本章节主要来做明细页面点击后翻转的动画效果,该效果可以进行多种改变,以达到想要的效果。

1.首先我们需要进行翻转的正反两个view,前面我们已经做好了,分别是PKOElementDetailImageView和PKOElementDetailImageFlippedView,具体翻转动画在明细页面的控制其中进行,触发当然是PKOElementDetailImageView中的点击事件,前文已经提到。
2.PKOElementDetailImageView中的点击事件调用PKOElementDetailViewController中的flipImageView()方法,该方法具体实现翻转功能,注释中写的很详细。
代码如下。

[objc] view plain copy

  1. //翻转动画  
  2.     func flipImageView() {  
  3.         UIView.beginAnimations(nil, context:nil)  
  4.         //平滑动画效果  
  5.         UIView.setAnimationCurve(UIViewAnimationCurve.Linear)  
  6.         UIView.setAnimationDuration(1)  
  7.           
  8.         var reflectionHeight: CGFloat  
  9.         var reflectedImage: UIImage?  
  10.           
  11.         //点击正面  
  12.         if(self.frontViewIsVisible == true){  
  13.             UIView.setAnimationTransition(UIViewAnimationTransition.FlipFromLeft, forView: self.subView!, cache: true)  
  14.             self.detailImage.removeFromSuperview()  
  15.             self.subView?.addSubview(self.detailImageFlipped)  
  16.         }  
  17.         //点击反面  
  18.         else{  
  19.             UIView.setAnimationTransition(UIViewAnimationTransition.FlipFromRight, forView:self.subView!, cache:true)  
  20.             self.detailImageFlipped.removeFromSuperview()  
  21.             self.subView?.addSubview(self.detailImage)  
  22.         }  
  23.         //提交动画  
  24.         UIView.commitAnimations()  
  25.         //设置是否正面显示标识  
  26.         self.frontViewIsVisible = !self.frontViewIsVisible  
  27.     }  

7.添加View的阴影

本章节主要来做明细页面图片的阴影效果,该效果可以进行高度设置,并且完全反射,包含所绘制的文字。

1.通过控制器PKOElementDetailViewController绘制明细图的同时,绘制图片的阴影,该阴影应该基于阴影的主图,所以放在PKOElementDetailImageView中处理。
reflectedImageWithHeight(height: UInt) ->UIImage该方法将返回对应阴影image。
具体做法请看注释,思路是:复制一个位图并裁剪成需要大小-翻转并绛色-填充渐变色
代码如下。

[objc] view plain copy

  1. //通过指定高度生成倒影图,方法完全照搬官方sample,  
  2.     func reflectedImageWithHeight(height: UInt) ->UIImage{  
  3.         //这里注意,swift不能直接在CG方法中用nil,需要声明一个变量  
  4.         var nil nilUnsafeMutablePointer: UnsafeMutablePointer<Void> = nil  
  5.         //rgb颜色容器,RGBA和CMYK的区别我会另开博文去说这个  
  6.         var colorSpace  = CGColorSpaceCreateDeviceRGB()  
  7.         var int32CGImageAlphaInfo = CGImageAlphaInfo.PremultipliedLast.toRaw()  
  8.         var bitmapInfo = CGBitmapInfo.fromRaw(int32CGImageAlphaInfo)  
  9.           
  10.         //使用CG绘制位图上下文,以下是方法的用法,网上抓的,大家可以试一下具体用法。  
  11.         //参数data指向绘图操作被渲染的内存区域,这个内存区域大小应该为(bytesPerRow*height)个字节。如果对绘制操作被渲染的内存区域并无特别的要求,那么可以传递NULL给参数date。  
  12.         //参数width代表被渲染内存区域的宽度。  
  13.         //参数height代表被渲染内存区域的高度。  
  14.         //参数bitsPerComponent被渲染内存区域中组件在屏幕每个像素点上需要使用的bits位,举例来说,如果使用32-bit像素和RGB颜色格式,那么RGBA颜色格式中每个组件在屏幕每个像素点上需要使用的bits位就为32/4=8。  
  15.         //参数bytesPerRow代表被渲染内存区域中每行所使用的bytes位数。  
  16.         //参数colorspace用于被渲染内存区域的“位图上下文”。  
  17.         //参数bitmapInfo指定被渲染内存区域的“视图”是否包含一个alpha(透视)通道以及每个像素相应的位置,除此之外还可以指定组件式是浮点值还是整数值。  
  18.         var mainViewContentContext = CGBitmapContextCreate(nilUnsafeMutablePointer, UInt(self.bounds.size.width), height, UInt(8), UInt(0), colorSpace, bitmapInfo!)  
  19.           
  20.         //注意,swift操作CG是不需要释放的,CG内部的GC已经处理了  
  21.           
  22.         //调整位图位置,CGContextTranslateCTM为位移方法  
  23.         var translateVertical = CGFloat(self.bounds.size.height) - CGFloat(height)  
  24.         //这里相当于翻转  
  25.         CGContextTranslateCTM(mainViewContentContext, 0, -translateVertical)  
  26.           
  27.         //将该位图渲染到layer层,layer层是view的根层,这里相当与copy一个self  
  28.         self.layer.renderInContext(mainViewContentContext)  
  29.           
  30.         //根据位图上下文生成位图  
  31.         var mainViewContentBitmapContext = CGBitmapContextCreateImage(mainViewContentContext)  
  32.           
  33.         //创建一个mask,确认刚才生成的位图那些是需要显示的,这里主要用它的渐变功能,image mask就像是用于表征色彩放在页面的哪一部分  
  34.         var gradientMaskImage = PKOElementDetailImageView.AEViewCreateGradientImage(UInt(1), pixelsHigh: UInt(height))  
  35.           
  36.         //将位图需要显示的部分显示出来  
  37.         var reflectionImage = CGImageCreateWithMask(mainViewContentBitmapContext, gradientMaskImage)  
  38.           
  39.         //通过image生成UIImage,并返回  
  40.         var theImage = UIImage(CGImage: reflectionImage)  
  41.         return theImage  
  42.     }  
  43.       
  44.     class func AEViewCreateGradientImage ( pixelsWide: UInt, pixelsHigh: UInt) ->CGImageRef {  
  45.         var nil nilUnsafeMutablePointer: UnsafeMutablePointer<Void> = nil  
  46.         var colorSpace = CGColorSpaceCreateDeviceGray()  
  47.         var int32CGImageAlphaInfo = CGImageAlphaInfo.None.toRaw()  
  48.         var bitmapInfo = CGBitmapInfo.fromRaw(int32CGImageAlphaInfo)  
  49.         //使用CG绘制位图上下文,渐变色位图  
  50.         var gradientBitmapContext = CGBitmapContextCreate(nilUnsafeMutablePointer, pixelsWide, pixelsHigh,  
  51.             UInt(8), UInt(0), colorSpace, bitmapInfo!)  
  52.           
  53.         //创建渐变对象,对于CG渐变我会在开博文详细解释  
  54.         var colors: [CGFloat] = [0.0, 1.0,1.0, 1.0]  
  55.         var nil nilUnsafePointer: UnsafePointer<CGFloat> = nil  
  56.         var grayScaleGradient = CGGradientCreateWithColorComponents(colorSpace, colors, nilUnsafePointer, UInt(2))  
  57.           
  58.         //渐变的开始点和结束点  
  59.         var gradientStartPoint = CGPointZero  
  60.         var gradientEndPoint = CGPointMake(0, CGFloat(pixelsHigh))  
  61.           
  62.         //填充渐变色  
  63.         CGContextDrawLinearGradient(gradientBitmapContext, grayScaleGradient, gradientStartPoint, gradientEndPoint, CGGradientDrawingOptions())  
  64.           
  65.         //通过image生成UIImage,并返回  
  66.         var theCGImage = CGBitmapContextCreateImage(gradientBitmapContext)  
  67.         return theCGImage  
  68.     }  

2.在PKOElementDetailViewController中图像渲染时调用PKOElementDetailImageView中的reflectedImageWithHeight(height: UInt) ->UIImage返回image,将其添加在subview中。
代码如下。

[objc] view plain copy

  1. //创建倒影图  
  2.         var reflectionRect = imageRect  
  3.         reflectionRect.size.height = CGFloat(CGRectGetHeight(reflectionRect)) * CGFloat(reflectionRadio)  
  4.         reflectionRect = CGRectOffset(reflectionRect, 0, CGRectGetHeight(imageRect))  
  5.         var reflectionView = UIImageView(frame: reflectionRect)  
  6.         self.reflectionImage = reflectionView  
  7.         var height = (self.detailImage?.bounds.height as CGFloat!) * CGFloat(reflectionRadio)  
  8.         self.reflectionImage.image = self.detailImage?.reflectedImageWithHeight(UInt(height))  
  9.         self.reflectionImage.alpha = 0.3  
  10.         //添加倒影  
  11.         self.subView?.addSubview(self.reflectionImage)  

3.在翻转的同时需要更新倒影,使倒影应用于反面,再次翻转时需要再次更新,保证阴影跟随主图的变幻而变化,在控制器的翻转方法flipImageView()中进行处理即可 。
代码如下。

[objc] view plain copy

  1. //翻转动画  
  2.     func flipImageView() {  
  3.         UIView.beginAnimations(nil, context:nil)  
  4.         //平滑动画效果  
  5.         UIView.setAnimationCurve(UIViewAnimationCurve.Linear)  
  6.         UIView.setAnimationDuration(1)  
  7.           
  8.         var reflectionHeight: CGFloat  
  9.         var reflectedImage: UIImage?  
  10.           
  11.         //点击正面  
  12.         if(self.frontViewIsVisible == true){  
  13.             UIView.setAnimationTransition(UIViewAnimationTransition.FlipFromLeft, forView: self.subView!, cache: true)  
  14.             self.detailImage?.removeFromSuperview()  
  15.             self.subView?.addSubview(self.detailImageFlipped)  
  16.               
  17.             // 更新倒影  
  18.             reflectionHeight = (self.detailImageFlipped.bounds.height as CGFloat) * CGFloat(reflectionRadio)  
  19.             reflectedImage = self.detailImageFlipped.reflectedImageWithHeight(UInt(reflectionHeight))  
  20.             self.reflectionImage.image = reflectedImage  
  21.         }  
  22.         //点击反面  
  23.         else{  
  24.             UIView.setAnimationTransition(UIViewAnimationTransition.FlipFromRight, forView:self.subView!, cache:true)  
  25.             self.detailImageFlipped.removeFromSuperview()  
  26.             self.subView?.addSubview(self.detailImage!)  
  27.               
  28.             // 更新倒影  
  29.             reflectionHeight = (self.detailImage!.bounds.height as CGFloat) * CGFloat(reflectionRadio)  
  30.             reflectedImage = self.detailImage?.reflectedImageWithHeight(UInt(reflectionHeight))  
  31.             self.reflectionImage.image = reflectedImage  
  32.         }  
  33.         //提交动画  
  34.         UIView.commitAnimations()  
  35.         //设置是否正面显示标识  
  36.         self.frontViewIsVisible = !self.frontViewIsVisible  
  37.     }  

至此全部改造完成,完整源代码请去第一篇下载

原文地址:http://blog.csdn.net/ooppookid/article/details/40373609

时间: 2024-10-28 07:49:42

Swift教程_零基础学习Swift完整实例(八)_swift完整实例(添加View的动画效果、添加View的阴影)的相关文章

Swift教程_零基础学习Swift完整实例(一)_swift实例简介

一.文章简介 本人最近开始学习有关Swift这个新东东,由于没有项目支撑,只能通过官方文档进行自学,精简的看了Swift官方文档,感觉理解起来还是比较简单,于是突发奇想,想把官方object-c的sample进行改造,使用Swift完成重点sample的改造,并对在改造过程中出现的问题进行分析,由于是初学,希望各类大牛能够指出其中错误,我会及时修改.预计每天更一篇,争取本周末搞定. 首先想改造的就是笔者最关心的tableView和CG,最好的例子莫过于Element.下面章节将介绍一下这个例子(

Swift教程_零基础学习Swift完整实例(四)_swift完整实例(搭建程序结构、构建storyboard)

四.swift重写Sample 本章开始进入正题,笔者将分搭建程序结构.构建storyboard.构建数据层.构建展示层.构建控制层.添加View的阴影.添加View的动画效果七个部分来对官方Sample的Element工程进行重写,其中涉及到的问题会给出分析和说明.不太了解storyboard的请参考官方教程<Start Developing iOS Apps Today> 1.搭建程序结构 对于程序的目录结构,完全是按照我个人的习惯所创建,由于结构对编译运行没有任何影响,是完全面向开发者的

Swift教程_零基础学习Swift完整实例(九)_总结

五.总结 加上写博文的时间,用了前前后后一周左右的时间,每晚2小时左右,完成了这个改造,由于我是第一次碰swift,有些东西还用不顺手,用时比较长.期间还简单学习了一下swift基本语法和部分用法.下面主要说一下我对swift语言的看法以及这次改造中对swift的理解. 1.个人对swift语言的看法 Swift作为苹果公司重推的开发语言,从苹果角度已经声称要取缔objC,估计未来可能会做更大的调整.该语言在我来看有以下特点(是不是优点不同的人不同的看法). 1.弱化了接口这个概念,大家不用再去

Swift教程_零基础学习Swift完整实例(五)_swift完整实例(构建数据层)

3.构建数据层 按照官方sample,我们使用简单的plist来保存数据(当然使用内置数据库也ok).该plist既是我们列表中需要显示的内容. 1.将化学元素的数据整理为Elements.plist,该plist的结构为Array<Dictionary>(Java表示为ArrayList<Map<String,Object>>). dictionary中包含若干键值对,但一定要保证每个dictionary键值对的键和值的类型一致,这样我们才能够进行数据的解析.如图.

Swift教程_零基础学习Swift完整实例(三)_swift基础(对象和类、枚举和结构、协议和扩展、泛型)

4.对象和类(Objects and Classes) 1.同Java一致,使用class和类名来创建一个类. 2.使用init创建一个构造方法,使用deinit创建一个析构方法,通过构造方法来初始化类实例.创建类实例同java一致,在类名后面加上()(实际是调用无参数的构造方法init(),构造方法也可以带参数).使用.来访问实例的属性和方法. [objc] view plain copy class NamedShape {       var numberOfSides: Int = 0/

Swift教程_零基础学习Swift完整实例(六)_swift完整实例(构建控制层)

4.构建控制层 本章节主要来构建个功能的控制层,为之前已经创建好的storyboard中页面的自定义controller添加对应功能. 1.TabBarViewController 该控制器按照需求通过数据层服务类PKOElementDataService所构建的实现了PKOTableDataSourceProtocol与UITableViewDataSource协议的4类数据集dataSource,并将他们赋值给tab种所展示view的控制器,即PKOElementTableViewContr

【J2ME 2D 游戏开发系列】◣HIMI游戏开发启蒙教程◢JAVA零基础学习J2ME游戏开发全过程!

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/j2me-2/774.html Himi从写博客的最早开始就是Android游戏开发相关的,其实那么很多童鞋也知道Himi是做Java-J2me/Kjava出身,所以不少童鞋还在问我是否可以写一些J2me的相关游戏开发博文.虽然j2me趋势随着Nokia的没落和Android的崛起已经慢慢被弱化掉,但是J2me也是早些年非常火的平台不是么!

怎样从零基础学习EXCEL?

  怎样从零基础学习EXCEL?          后来工作会对你的数据处理能力提出要求(除非你懒,错过了那么好的学习机会).可能开始的时候,你会发现一个函数能自动计算求和(sum),能算平均数(average),你就很开心了.接下来你会发现经常要从一个表里面寻找另一个表里面的内容(vlookup就很有用),有时候很多要做条件(if函数就很有用). 其实到这里就能解决大概80%的工作问题了.就几个函数不会很难吧,特别是当你发现以前要好久的时间,现在很快就完成了.至于以后的深入学习就看你的工作是否

零基础学习AJAX之AJAX框架_AJAX相关

上文(零基础学习AJAX之AJAX的简介和基础)对ajax异步请求服务器做了详细的介绍和基础应用,可以看出,ajax的一些过程是相对不变的.不必要每次发送请求都写一遍发送代码,一些ajax开发人员已经把他们的过程封装成ajax框架. 本节主要介绍ajaxLib和ajaxGold两款框架. 1.ajaxLib ajaxLib是一个非常小巧的ajax框架. 使用它首先将文件使用引入到页面中.改框架是一个直接获取XML的框架,调运函数如下: loadXMLDoc(url,callback,boolea