玩转iOS 9的UIDynamics
2015-07-20 21:44
369 查看
玩转iOS 9的UIDynamics
本文由CocoaChina翻译小组成员AGSpider(微博)翻译自fancypixel的博客,原文:Playing With UIDynamics in iOS
9
UIDynamics在iOS7 SDK中是一个受欢迎的新加特性, 它基本上是一个支持UIView的物理引擎,可以让我们自定义UI 控件的物理特性。这个API浅显易懂,你可以轻松地创建很棒的动画或者过渡效果。之前我在 这篇文章 中已经涵盖了其基本要点,
而这一次,我们将看看iOS 9里的UIDynamics有什么新玩意。
碰撞边界(Collision Bounds)
UIDynamics 的第一个版本带有碰撞系统(在 UICollisionBehavior 中)只支持矩形。这可以理解,因为UIViews都是矩形架构,但是圆形的却不常见,更不用说优化一个自定义的贝塞尔曲线。在iOS
9中,UIDynamicItem协议里加了一个新属性:UIDynamicItemCollisionBoundsType,支持以下枚举类型:
Rectangle
Ellipse
Path
这个属性是只读的,如果我们想修改它的话,需要提供我们的子类:
而这是同一个带.Ellipse属性的UIView。
这涵盖了圆形的视图,如果我们突发奇想,画一个更复杂,有连续的刚体,我们就可以使用.path枚举类型啦,并且也要重写该属性:
Field Behavior
Field Behavior是在整个场景中运用的一种新behavior。一个最普通的例子就是我们一直默默地使用着的UIGravityBehavior,即场景中的每个物体都会受到一个向下的重力。现在我们可以使用一组新的场力,就像径向(距离场景中心越近,力越大)、噪声(在场景内随机产生的不同的力)等等。
Dynamic Item Behavior(动力元素行为)
UIDynamicItemBehavior 包含了几个有趣的新特性:
var charge: CGFloat
var anchored: Bool
charge 代表能够影响一个元素在电磁场上如何移动的电荷(是的,听起来很疯狂),而anchored本质上是将图形变成了碰撞中的一个静态物体,但没有响应事件(如果有什么东西撞上了它,它会丝毫不动),所以可以完美地用来表示地板或墙壁。
Attachment Behavior(吸附行为)
UIAttachmentBehavior改进后,现在像个具有新方法和属性的侦探,如同frictionTorque和attachmentRange一样。现在吸附行为变得更加灵活,我们可以指定相对滑动的动作、固定吸附、绳索链接和我最喜欢的:针型吸附。想像一下两个钉在一起的物体你就明白了。这些基本涵盖了UIDynamics的新特性,现在,是时候丢下这个更新日志,并开始搭建一些很二的东西了。
让我们玩球吧
我上周花了很多时间在球王(Ball King)上。这一个很棒的消磨时间的东西,这游戏的的理念很简单,但是表现很出色。并且,它采用了获得苹果设计奖的Crossy
Roadde 相同的理念:它不会以任何方式影响到玩家,比如游戏内的荣誉。
我非常喜欢它的一点是球的物理模型,以及当球打到篮板上时篮板的反应。看起来用它来测试上面提到的UIDynamics新特性应该会非常不错。让我们来看看如何一步步地打造属于自己的简单的版本吧:BallSwift
篮框
篮球架可以用一个UIView作为篮板,几个UIView作为篮框的左右两边,最前面的view作为篮框本身(不带物理刚体)。使用我们之前定义的类Ellipse,我们就可以创造我们的游戏场景的视觉表现:
螺母和螺栓(Nuts and bolts)
篮框的最重要的部分是左右臂,它们需要一个物理圆形身体(使得与球的碰撞显得自然),需要用螺栓固定在板和前框。这两个将成为基本的UIDynamicItems,并不会直接碰撞参与碰撞。新推出的针型吸附就是为此而生的,它可以把一切都完美地结合在一起,因为我们可以在这个比较粗糙的图画上看到:
在给定的确定空间点内,pin一次仅可连接几个视图:
左臂用螺栓固定在篮板的左侧
右臂用螺栓固定在篮板右侧
篮框用螺栓固定在篮板的左侧
下一个步骤要求我们将篮板悬挂上,别将它固定死,这样球一个碰撞就可以使得它转动,就像在Ball King这个游戏中一样:
4000 |
然后,我们可以将球作为一个普通的UIImageView实例化:
Collisions and gravity(碰撞和重力)
我提到了UIDynamicItemBehavior的新属性anchored,即禁用了对象的动态behavior,同时将其保留在在碰撞循环里。听起来用它来搭建一个坚固的地板会很不错:
好吧,一切都设置好啦,现在只需要一些重力和一组碰撞事件了:
这下你该明白了吧,虽然场景边缘真的画的很low,但是搭建它真的很有趣(是的,云朵和灌木丛都是一样的勾画,就像 超级马里奥 里中的)。
相关文章推荐
- UIbutton系统按键(System)和图片按键(Custom)对比
- 关于TableViewCell 自适应(文字自适应)
- UIButton
- HDU5033 Building(单调栈)
- UITabBar自定义方式二(容器类控制器)
- CEF Xilium.CefGlue 防止浏览器闪退
- Request failed: unacceptable content-type: text/plain
- Android uevent
- 每天一个小知识点8(jQuer总结二)
- ajaxfileupload动态构造的表单如何清空file的value值
- UnicodeEncodeError: 'gbk' codec can't encode character '\xbb' in position 0: illegal multibyte sequence
- Queue的使用
- 【贪心】 TOJ 4121. Muxiaokui's Problem
- Android系统UI设计之:Widget控件
- toj4121. Muxiaokui's Problem
- 构建一个基于UIView的类别
- FineUi导出时禁用ajax即EnableAjax="false"出现问题的解决方法
- 关于UI功能解锁,UI特效动画,UI tips的再思考
- HDU1005 Number Sequence
- 常用bluetooth协议