实战iOS9:剖析UIKit Dynamics的改进.doc_第1页
实战iOS9:剖析UIKit Dynamics的改进.doc_第2页
实战iOS9:剖析UIKit Dynamics的改进.doc_第3页
实战iOS9:剖析UIKit Dynamics的改进.doc_第4页
实战iOS9:剖析UIKit Dynamics的改进.doc_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

网址:实战iOS 9:剖析UIKit Dynamics的改进UIKit Dynamics是在iOS 7中首次被介绍,可以让开发者通过简单的方式,给应用界面添加模拟物理世界的交互动画。iOS 9中又加入了一些大的改进,我们将在本文中查看一些。Non-Rectangular Collision Bounds在iOS 9之前,UIKitDynamics的collision bounds只能是长方形。这让一些并非是完美的长方形的碰撞效果看起来有些古怪。iOS 9中支持三种collision bounds分别是Rectangle(长方形)、Ellipse(椭圆形)和Path(路径)。Path可以是任意路径,只要是逆时针的,并且不是交叉在一起的。一个警告是,path必须是凸面的不能使凹面的。为了提供一个自定义的collision bounds ,你可以子定义一个UIView的子类。cppview plaincopy1. classEllipse:UIView2. overridevarcollisionBoundsType:UIDynamicItemCollisionBoundsType3. return.Ellipse4. 5. 如果你有个自定义的视图有一个自定义的bounds,你同样可以这么做。UIFieldBehavior在iOS 9之前,只有一种gravity behaviour(重力感应)类型的behaviour。开发者也无法扩展或者自定义其他类型。现在,UIKit Dynamics包含了更多的behaviours: Linear Gravity Radial Gravity Noise Custom这些behaviours都有一些属性可以用来设置不同的效果,并且可以简单的添加和使用。Building a UIFieldBehavior & Non-Rectangular Collision Bounds Example我们来用创建一个例子,把这两个特性都融合进来。它有几个视图(一个椭圆和一个正方形)添加了一些碰撞逻辑和一些噪音的UIFieldBehavior。要使用UIKit Dynamics,首先要创建一个UIDynamicAnimator。在viewDidLoad方法中,为你的变量创建一个引用。cppview plaincopy1. /SetupaUIDynamicAnimatorontheview.2. animator=UIDynamicAnimator(referenceView:view)现在你需要添加一些视图,它们将会动起来。cppview plaincopy1. /Addtwoviewstotheview2. letsquare=UIView(frame:CGRect(x:0,y:0,width:100,height:100)3. square.backgroundColor=.blueColor()4. view.addSubview(square)5. 6. letellipse=Ellipse(frame:CGRect(x:0,y:100,width:100,height:100)7. ellipse.backgroundColor=.yellowColor()8. ellipse.layer.cornerRadius=509. view.addSubview(ellipse)这是我们给view添加的两个基本的behaviors。cppview plaincopy1. letitems=square,ellipse2. 3. /Createsomegravitysotheitemsalwaysfalltowardsthebottom.4. letgravity=UIGravityBehavior(items:items)5. animator.addBehavior(gravity)第一个behaviors,我们添加了一个重力感应模型。cppview plaincopy1. letnoiseField:UIFieldBehavior=UIFieldBehavior.noiseFieldWithSmoothness(1.0,animationSpeed:0.5)2. /Setupthenoisefield3. noiseField.addItem(square)4. noiseField.addItem(ellipse)5. noiseField.strength=0.56. animator.addBehavior(noiseField)接下来我们添加了一个UIFieldBehavior。使用noiseFieldWithSmoothness方法进行了初始化。我们把方形和椭圆形添加到了behavior中,然后给animator添加了field behavior。cppview plaincopy1. /Dontletobjectsoverlapeachother-setupacollidebehaviour2. letcollision=UICollisionBehavior(items:items)3. collision.setTranslatesReferenceBoundsIntoBoundaryWithInsets(UIEdgeInsets(top:20,left:5,bottom:5,right:5)4. animator.addBehavior(collision)我们接着创建了一个UICollisionBehavior。这会阻止两个元素在碰撞时叠加,并增加了物理模型的动画效果。我们使用setTranslatesReferenceBoundsIntoBoundaryWithInsets,给视图添加了一个边缘的设置。如果不设置这个盒子的话,刚才的重力感应动画会把方形和椭圆形的视图掉进屏幕以下,而回不来。(我们就看不到碰撞了)说到重力感应,我们需要确保他的方向始终是朝下的,也就是实际的物理世界中的方向。为了做到这点,我们需要使用 CoreMotion framework。创建一个CMMotionManager 变量。cppview plaincopy1. letmanager:CMMotionManager=CMMotionManager()我们设置一个变量作为类的属性,是因为我们始终需要用到它。否则的话,CMMotionManager会因为被释放掉而无法更新。当我们发现设备的方向发生变化,为们设置重力感应模型的 gravityDirection属性来,让重力的方向始终向下。cppview plaincopy1. /Usedtoalterthegravitysoitalwayspointsdown.2. ifmanager.deviceMotionAvailable3. manager.deviceMotionUpdateInterval=0.14. manager.startDeviceMotionUpdatesToQueue(NSOperationQueue.mainQueue(),withHandler:5. deviceManager,errorin6. gravity.gravityDirection=CGVector(dx:deviceManager!.gravity.x,dy:-deviceManager!.gravity.y)7. )8. 注意,我们这个例子只支持了portrait一种模式,如果你希望支持全部的方向的话,你可以自己添加一些计算代码。当你打开应用时,你可以看到如下图一样的画面。方形视图围绕着椭圆移动,但你无法看出什么门道。WWDC的session 229,介绍了一个方法,可以可视化的看到动画的效果。你需要添加一个桥接头(如果是用swift写的项目),添加以下代码。cppview plaincopy1. importUIKit;2. #ifDEBUG3. interfaceUIDynamicAnimator(AAPLDebugInterfaceOnly)4. /Usethispropertyfordebugpurposeswhentesting.5. property(nonatomic,getter=isDebugEnabled)BOOLdebugEnabled;6. end7. #endif这会暴露一些私有API,让UIDynamicAnimator把debug模式打开。这能让你观察到空间扭曲的情况。在ViewController类中,把animator的debugEnable属性设置为true。cppview plaincopy1. animator.debugEnabled=true/PrivateAPI.Seethebridgingheader.现在,当你打开应用时,你就能够看到UIFieldBehavior提供的空间扭曲了。你同样能够看到视图碰撞时,围绕在方形和圆形上的的轮廓线。你还可以添加另外一些属性,它们并非API 的标注属性,但是可以在lldb中使用。比如debugInterval和debugAnimationSpeed,当你需要debug你的动画时,它们会非常有帮助。我们可以看到field起了作用,可以清楚的看到碰撞的效果。如果我们想tweak更多属性,可以给对象设置具体的数值,然后重启应用看看它的变化。我们给页面添加三个UISlider控制组件,分别控制力量、平滑度和速度,力量的组件数值范围在0-25,其他两个都是0-1。当你在Interface Builder中创建好,拖拽三个动作事件到ViewController类,然后按下面设置,更新它们的属性。cppview plaincopy1. IBActionfuncsmoothnessValueChanged(sender:UISlider)2. noiseField.smoothness=CGFloat(sender.value)3. 4. IBActionfuncspeedValueChanged(sender:UISlider)5. noiseField.animationSpeed=CGFloat(sender.value)6. 7. IBActionfuncstrengthValueChanged(sender:UISl

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论