Swift中的UIKit动力学
重力学这个名词不论在哪个行业领域听起来似乎都很高大上。那么在Swift中的重力学是什么呢?那就是将我们移动端屏幕上毫无生命力的东西也置于万有引力中,使它们能够展现出好像真的由于引力而向下坠落以及碰到物体后自然的弹开的效果。 要想做到这一点,我们得需要两个利器:
当这两者一起使用的时候,我们就可以让程序活起来,富有生命力。 让我们开始屌丝的逆袭我们挑一些小例子来学习
打开Xcode6新建项目,选择 打开 // 创建一个正方形View,颜色设置为蓝绿色,加入当前的View中
let square = UIView(frame: CGRect(x: 100, y: 100, width: 100, height: 100));
square.backgroundColor = UIColor.cyanColor();
self.view.addSubview(square);
上面的代码在我们的屏幕上添加了一个蓝绿色的正方形 如果你用真机运行,你可以摇晃一下手机、倾斜手机、拿着手机手舞足蹈一下,看看那个木讷的方块有什么反应和变化么?答案是要有反应你就见鬼了。因为我们写的这几行代码只能让它杵在那一动不动,那怎么能让它动起来呢?接下来让我们见证奇迹的时刻! 添加重力行为在 // UIKit物理引擎
var animator: UIDynamicAnimator!;
// 重力行为
var gravity: UIGravityBehavior!;
然后在 // 实例化UIKit物理引擎类,作用于ViewController的View
animator = UIDynamicAnimator(referenceView: self.view);
// 实例化重力行为类,目前只作用于刚才创建的正方形View
gravity = UIGravityBehavior(items: [square]);
// 将重力行为添加到UIKit物理引擎类中
animator.addBehavior(gravity);
现在再编译运行一下,这时我们可以看到这个蓝绿色正方形开始做自由落体运动了,一直跌落出屏幕下边缘然后消失。 我们来看看刚才我们添加的两个属性的类型:
UIKit 物理引擎中的类。它的作用是跟踪你添加到物理引擎中的各种行为动作,比如这里的重力行为,并且提供整个上下文。实例化UIDynamicAnimator 时,它的构造函数需要传入一个referenceView 参数,用于告知它要跟踪并制定坐标的View 。
大多数的行为都有一些配置属性,比如重力行为就有可以改变角度和速率的属性: // 实例化UIKit物理引擎类,目前只作用于刚才创建的正方形View
animator = UIDynamicAnimator(referenceView: self.view);
// 实例化重力行为类,目前只作用于刚才创建的正方形View
gravity = UIGravityBehavior(items: [square]);
// 角度
gravigy.angle = 1.6;
// 速率
gravigy.magnitude = 0.1;
// 将重力行为添加到UIKit物理引擎类中
animator.addBehavior(gravity);
上述代码中的
不能让我们的方块一坠千里从目前代码的运行状况知道,我们的方块下降到屏幕底部时丝毫没有停止的意思,直接坠崖而下,看都看不见。我们希望我们的屏幕类似一个盒子一样,方块在盒子中,当下降到底部时就停止,那么我们就需要设置一个边界。 在 // 碰撞行为
var collision: UICollisionBehavior!;
然后在 // 实例化碰撞行为类,目前只作用于刚才创建的正方形View
collision = UICollisionBehavior(items: [square]);
// 将参考视图的边界作为碰撞边界
collision.translatesReferenceBoundsIntoBoundary = true;
// 将碰撞行为添加到UIKit物理引擎类中
animator.addBehavior(collision);
上面的代码创建了边界行为,它会将一个或多个边界与指定的View联系起来,并使两者有具有交互行为。 从上面代码我可以注意到 接着我们编译运行看看,此时小方块坠落到屏幕底部时会产生碰撞效果,并且还会反弹几下,是不是很逼真呢。 碰撞行为进阶应用接下来我们在屏幕中再添加一个View,长方形并横在屏幕中间,在 但是我们发现这个红色的障碍物和方块并没有任何交互行为,这里有一点很重要:只有被行为关联起来的Views才会具有交互行为。我们来看看下面这张关系图: 如果我们想让 将 编译并运行,让我们来看看睡醒的 我们再来看看现在app中行为与元素的关系图: 来看看我给这个红色长方形view起的名字: 等等,为什么 这显然不是我想要的结果,我希望 我们先去掉 改为: 然后在这行下面添加另外一行代码: 这行代码的意思是在碰撞效果中添加一个隐形的边界,它的位置和形状和 我们看到了当蓝绿色方块下降碰到红色障碍物时产生了碰撞行为,蓝绿色方块弹开并翻转落下。 从上面内容我们了解到,Swift的UIKit动力引擎非常强大,通过简短的几行代码就可以帮助我们实现惊艳的实现行为。下篇文章会向大家详细的介绍碰撞行为背后的故事。 参考原文:UIKit Dynamics Tutorial in Swift 在UIKit的动态引擎中,每个行为都有一个 上面的代码记录了蓝绿色方块坠落、碰撞时的 我们可以看到,随着方块的坠落,它的 通过这些信息我们得知,动态引擎通过不断改变 虽然这些数据的精确度可能不是很高,但关键在于这些数据让我们知道了动力引擎是如何进行驱动的,通过这些数据也让我们知道了在行为动作背后也是有据可循的。因此,我们能不能通过程序改变这些数据呢,也就是从另一个层面来控制物体的行为动作。如果是这样的话,那么就需要我们自己计算出一套运行轨迹和行为的数据,而不是通过动作引擎去控制了。 这里有一个协议,它描述了动作行为的数据模型,那就是 因为 到目前为止,我们的程序中已经添加了两个View和两个行为,并让他们产生碰撞行为,那么下面我们将看看当他们互相发生碰撞时我们如何捕获这个行为呢。 我们回到 在 然后我们实现 这个方法在View每次发生碰撞时调用。我们让它在控制台打印一些信息。为了能更好的查看该方法中打印的信息,我们将之前设置的 我们编译运行一下,可以看到当View之间发生交互,也就是碰撞时,我们在控制台看到了打印信息: 从上面的打印信息中可以看出,坠落的方块与标示符为 我们接着在该方法中添加代码: 通过上面的代码可以看出,我们定义了一个 我们可以看到当方块每次发生碰撞行为时,它都会闪着黄色。 到目前为止,我们所看到的一切都是由动作引擎帮我们实现的,比如说碰撞质量、弹力等,那么接下来,你会看到如何通过 在 上面的代码中,我们创建了一个行为项,它与方块View相关联,修改它的弹力为0.6,然后将其添加到行为中。 我们编译运行一下,看看现在当方块发生碰撞时会有什么反应: 我们也可以通过 上面代码的意思是,每当 在上面的代码中,我们只修改了弹力属性 在目前的程序中,我们都是预先设置好了View的各种行为和行为属性,那么这一节我们会展现如何动态的添加或移除行为。 我们打开 然后在碰撞代理的方法 我们又创建了一个正方形View,背景色设置为灰色,将它添加至碰撞和重力行为中,然后我们创建了一个关联行为,将这个正方形和我们之前创建的正方形关联起来。 编译运行一下,我们可以看到当之前创建的方块与障碍物发生碰撞后,会出现另一个方块: 虽然你看到了两个方块似乎被连接起来了,但是之间没有连线,因为我们只是动态的添加了一个行为,然后由该行为达到了这种效果。 现在你看到了,我们可以在系统运行时动态的添加或删除行为。在最后呢,我们再介绍一个行为,那就是 为了能更好的看清楚效果,我们将刚才添加的那段用于显示方块运行轨迹的代码注释掉,也就是下面这段代码: 然后我们在 在 将 然后我们重写 上述代码的作用非常清晰,首先判断Snap行为是否存在,如果存在就从引擎中移除。然后实例化Snap行为,作用项是 参考原文:UIKit Dynamics Tutorial in Swift (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |