UIKitDynamics在iOS7中首次引入,允许开发者以简单的方式将模拟物理世界的交互式动画添加到应用程序界面。iOS9中添加了一些重大改进,我们将在本文中了解其中的一些改进。非矩形碰撞边界在iOS9之前,UIKitDynamics的碰撞边界只能是矩形。这使得一些不完美的矩形的碰撞效果看起来有些怪异。iOS9中支持三种碰撞边界分别是Rectangle(矩形)、Ellipse(椭圆)和Path(路径)。Path可以是任何路径,只要是逆时针方向且不相交即可。一个警告是路径必须是凸的而不是凹的。要提供自定义碰撞边界,您可以子类化UIView。代码1如果您有一个带有自定义边界的自定义视图,您可以执行相同的操作。在iOS9之前,UIFieldBehavior只有一种重力行为(gravitysensing)类型的行为。开发人员也无法扩展或自定义其他类型。现在,UIKitDynamics包含了更多的行为。LinearGravityRadialGravityNoiseCustom这些行为有一些属性可以用来设置不同的效果,并且可以很容易地添加和使用。构建UIFieldBehavior和非矩形碰撞边界示例让我们创建一个结合这两个功能的示例。这是一个具有多个视图(椭圆和正方形)的UIFieldBehavior,其中添加了一些碰撞逻辑和一些噪音。结果1要使用UIKitDynamics,首先要创建一个UIDynamicAnimator。在viewDidLoad方法中,创建对变量的引用。代码2现在你需要添加一些视图,它们将被动画化。代码3这是我们添加到视图中的两个基本行为。代码4第一个行为,我们添加了一个重力感应模型。代码5接下来我们添加一个UIFieldBehavior。使用noiseFieldWithSmoothness方法初始化。我们将正方形和椭圆添加到行为中,然后将场行为添加到动画器中。代码6然后我们创建一个UICollisionBehavior。这可以防止两个元素叠加碰撞,并添加到物理模型的动画中。我们使用setTranslatesReferenceBoundsIntoBoundaryWithInsets向视图添加边缘设置。如果不设置这个框,刚才的重力感应动画会把正方形和椭圆形的view丢到屏幕下面,不会再回来了。(我们看不到碰撞了)说到重力感应,我们要保证他的方向永远是向下的,也就是实际物理世界中的方向。为此,我们需要使用CoreMotion框架。创建一个CMMotionManager变量。代码7我们将变量设置为类的属性,因为我们总是需要它。否则,CMMotionManager因为被释放,无法更新。当我们发现设备的方向发生变化时,我们设置重力感应模型的gravityDirection属性,让重力的方向一直向下。代码8注意我们的例子只支持一种模式的人像,如果你想支持所有方向,你可以自己添加一些计算代码。当您打开该应用程序时,您会看到如下所示的屏幕。视觉车站广场视图围绕椭圆移动,但你看不到发生了什么。WWDC的Session229介绍了一种可视化动画效果的方法。需要添加桥接头(如果项目是用swift写的),添加如下代码。code9这会暴露一些私有的API,让UIDynamicAnimator开启debug模式。这使您可以观察空间扭曲。在ViewController类中,将动画师的debugEnable属性设置为true。code10#p#现在,当您打开应用程序时,您可以看到UIFieldBehavior提供的空间扭曲。在调试模式下,当视图发生碰撞时,您还可以看到方形和圆形周围的轮廓。你还可以添加一些其他的属性,它们不是API注解属性,但是可以在lldb中使用。当您需要调试动画时,诸如debugInterval和debugAnimationSpeed之类的东西非常有用。我们可以看到该场有效,我们可以清楚地看到碰撞的效果。如果我们想调整更多属性。我们可以为对象设置具体的值。然后重启应用程序就可以看到他的变化了。我们向页面添加三个UISlider控件。分别控制强度、平滑度和速度。强度分量的取值范围是0-25,另外两个是0-1。interfacebuilder在InterfaceBuilder中完成后,将三个动作事件拖放到ViewController类中。,并按如下设置更新它们的属性。代码11现在,运行应用程序。可以通过控制条设置属性的具体值,观察动画的实际效果。结果希望这些可以让您快速了解UIFieldBehavior和非矩形碰撞边界API如何在UIKitDynamics中工作和调试。我建议您在真实设备(而不是模拟器)上查看效果,否则您将看不到运动效果。进一步阅读要了解有关UIKitDynamics中新功能的更多信息,请访问WWDC2015会议229What'sNewinUIKitDynamicsandVisualEffects。另外,不要忘记我们的演示项目文件在Github上可用。
