阅读更多

0顶
0踩

移动开发
本文出自:shinobicontrols,作者:Chris Grant,译文出自:Nathan_Bao的博客,译者:nathan1

iOS9 Day-by-Day是作者Chris Grant写的系列博客,覆盖了iOS开发者必须知道的关于iOS 9的新技术与API,并且还进行了实际操作演练,每篇文章中相关的代码Chris都会将其上传至GitHub上。在Search APIsUI TestingStoryboard ReferencesUIStackViewXcode Code CoverageMultitaskingContacts FrameworkApple Pay之后,作者写到了第九篇——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的子类。
class Ellipse: UIView {
    override var collisionBoundsType: UIDynamicItemCollisionBoundsType {
        return .Ellipse
    }
}

如果你有个自定义的视图有一个自定义的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方法中,为你的变量创建一个引用。
// Set up a UIDynamicAnimator on the view.
animator = UIDynamicAnimator(referenceView: view)

现在你需要添加一些视图,它们将会动起来。
// Add two views to the view
let square = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
square.backgroundColor = .blueColor()
view.addSubview(square)

let ellipse = Ellipse(frame: CGRect(x: 0, y: 100, width: 100, height: 100))
ellipse.backgroundColor = .yellowColor()
ellipse.layer.cornerRadius = 50
view.addSubview(ellipse)

这是我们给view添加的两个基本的behaviors。
let items = [square, ellipse]

// Create some gravity so the items always fall towards the bottom.
let gravity = UIGravityBehavior(items: items)
animator.addBehavior(gravity)

第一个behaviors,我们添加了一个重力感应模型。
let noiseField:UIFieldBehavior = UIFieldBehavior.noiseFieldWithSmoothness(1.0, animationSpeed: 0.5)
// Set up the noise field
noiseField.addItem(square)
noiseField.addItem(ellipse)
noiseField.strength = 0.5
animator.addBehavior(noiseField)

接下来我们添加了一个UIFieldBehavior。使用noiseFieldWithSmoothness方法进行了初始化。我们把方形和椭圆形添加到了behavior中,然后给animator添加了field behavior。
// Don't let objects overlap each other - set up a collide behaviour
let collision = UICollisionBehavior(items: items)
collision.setTranslatesReferenceBoundsIntoBoundaryWithInsets(UIEdgeInsets(top: 20, left: 5, bottom: 5, right: 5))
animator.addBehavior(collision)

我们接着创建了一个UICollisionBehavior。这会阻止两个元素在碰撞时叠加,并增加了物理模型的动画效果。我们使用setTranslatesReferenceBoundsIntoBoundaryWithInsets,给视图添加了一个边缘的设置。如果不设置这个盒子的话,刚才的重力感应动画会把方形和椭圆形的视图掉进屏幕以下,而回不来。(我们就看不到碰撞了)

说到重力感应,我们需要确保他的方向始终是朝下的,也就是实际的物理世界中的方向。为了做到这点,我们需要使用 CoreMotion framework。创建一个CMMotionManager 变量。
let manager:CMMotionManager = CMMotionManager()  

我们设置一个变量作为类的属性,是因为我们始终需要用到它。否则的话,CMMotionManager会因为被释放掉而无法更新。当我们发现设备的方向发生变化,为们设置重力感应模型的 gravityDirection属性来,让重力的方向始终向下。
// Used to alter the gravity so it always points down.
if manager.deviceMotionAvailable {
    manager.deviceMotionUpdateInterval = 0.1
    manager.startDeviceMotionUpdatesToQueue(NSOperationQueue.mainQueue(), withHandler:{
        deviceManager, error in
        gravity.gravityDirection = CGVector(dx: deviceManager!.gravity.x, dy: -deviceManager!.gravity.y)
    })
}

注意,我们这个例子只支持了portrait一种模式,如果你希望支持全部的方向的话,你可以自己添加一些计算代码。

当你打开应用时,你可以看到如下图一样的画面。



方形视图围绕着椭圆移动,但你无法看出什么门道。WWDC的session 229,介绍了一个方法,可以可视化的看到动画的效果。你需要添加一个桥接头(如果是用swift写的项目),添加以下代码。
@import UIKit;
#if DEBUG
@interface UIDynamicAnimator (AAPLDebugInterfaceOnly)
/// Use this property for debug purposes when testing.
@property (nonatomic, getter=isDebugEnabled) BOOL debugEnabled;
@end
#endif

这会暴露一些私有API,让UIDynamicAnimator把debug模式打开。这能让你观察到空间扭曲的情况。在ViewController类中,把animator的debugEnable属性设置为true。
animator.debugEnabled = true // Private API. See the bridging header.  

现在,当你打开应用时,你就能够看到UIFieldBehavior提供的空间扭曲了。



你同样能够看到视图碰撞时,围绕在方形和圆形上的的轮廓线。你还可以添加另外一些属性,它们并非API 的标注属性,但是可以在lldb中使用。比如debugInterval和debugAnimationSpeed,当你需要debug你的动画时,它们会非常有帮助。

我们可以看到field起了作用,可以清楚的看到碰撞的效果。如果我们想tweak更多属性,可以给对象设置具体的数值,然后重启应用看看它的变化。我们给页面添加三个UISlider控制组件,分别控制力量、平滑度和速度,力量的组件数值范围在0-25,其他两个都是0-1。



当你在Interface Builder中创建好,拖拽三个动作事件到ViewController类,然后按下面设置,更新它们的属性。
@IBAction func smoothnessValueChanged(sender: UISlider) {
    noiseField.smoothness = CGFloat(sender.value)
}
@IBAction func speedValueChanged(sender: UISlider) {
    noiseField.animationSpeed = CGFloat(sender.value)
}
@IBAction func strengthValueChanged(sender: UISlider) {
    noiseField.strength = CGFloat(sender.value)
}

现在,运行应用。你可以通过控制条来设置属性的具体值,以观察动画的实际效果。



希望这些能够让你快速理解UIKit Dynamics里UIFieldBehavior和non-rectangular collision bounds APIs是怎么工作和debug的。我推荐你在真实的设备(而不是模拟器)中查看效果,否则你看不出motion所带来的效果变化。

延伸阅读

想要了解更多关于UIKit Dynamics的新特性,请浏览WWDC 2015的session 229 What's New in UIKit Dynamics and Visual Effects。另外,并忘了我们的Demo项目文件可以在Github上找到。
  • 大小: 349.2 KB
  • 大小: 3.8 KB
  • 大小: 26.7 KB
  • 大小: 14 KB
  • 大小: 227.5 KB
0
0
评论 共 0 条 请登录后发表评论

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • FlashFXP软件

    FlashFXP是一款功能强大的FXP/FTP软件。

  • FlashFXP 下载、安装、使用

    FlashFXP - Secure FTP Client Software for Windows. Upload, Download, and Synchronize your files.

  • ​FlashFXP工具的使用

    (1)打开FlashFXP,点击会话,选择快速连接。(2)输入需要连接的数据库的地址、用户名、密码等。连接成功后,可以使用该工具上传或者下载文件。

  • FlashFXP:全面的FTP客户端工具

    本文还有配套的精品资源,点击获取 简介:FlashFXP是一款高效且安全的FTP客户端软件,支持多种文件传输协议,包括FTP、FTPS和SFTP,适用于Windows系统。该软件简化了文件上传与下载过程,提供了便捷的站点管理、多线程传输、断点续传、加密传输和脚本支持等功能。对于开发人员和网站管理员来说,FlashFXP的快速部署代码功能特别有用,使文件传输更加简单高效。 ...

  • FlashFXP实战教程:高效FTP文件传输

    本文还有配套的精品资源,点击获取 简介:FlashFXP是一款功能强大的FTP客户端软件,本文将深入解析其核心特性和相关技术知识点。通过实战教程,用户将掌握FlashFXP的FTP连接、多线程传输、断点续传、同步浏览、脚本支持和安全传输等功能,提升文件管理效率。 1. FTP协议简介 FTP(文件传输协议)是一种用于在计算机之间传输文件的文件传输协议。它是一种客...

  • 使用FlashFXP和VMware进行Linux虚拟机间的文件传输

    点击"新建站点"按钮,输入站点名称,并在"主机"字段中填入Linux虚拟机的IP地址。而在Linux虚拟机之间进行文件传输是一个常见的需求,本文将介绍如何使用FlashFXP工具在Linux虚拟机间进行文件传输。在VMware虚拟机软件中,点击"新建虚拟机"按钮,按照向导创建一个新的Linux虚拟机。可以选择所需的Linux发行版,并设置虚拟机的硬件配置,如内存、硬盘大小等。完成虚拟机的创建后,启动该虚拟机。在Linux虚拟机中,我们需要安装FTP服务器软件,以便能够在虚拟机上提供文件传输的服务。

  • FlashFXP 5安装、远程访问服务器、以及修改密码

    软件下载链接: 链接:FlashFXP 5下载 提取码:buce 一、安装 第一步:点击下图图标进行安装,安装步骤就不给大家讲解了,比较简单,安装完成后请不要打开软件 第二步:将以下两个文件拷贝到FlashFXP 5的安装目录下 第三步:点击下图文件 第四步:然后选其中的patch,然后粘贴以下框中的内容 第五步:打开已经安装好的FlashFXP 5 软件,如果还是有时间限度条的话,就将第四步中的内容复制到注册信息中,即可完成长久使用。 二、连接 具体步骤如下: 三.

  • FlashFXP:Windows与Linux文件交互优化工具

    本文还有配套的精品资源,点击获取 简介:FlashFXP是一款针对Windows设计的高效FTP客户端软件,提供直观的图形用户界面和多种安全协议支持。此压缩包可能包含专为Linux系统交互优化的定制版FlashFXP,便于在Windows环境下进行Linux文件交换。软件支持多会话操作、拖放功能、文件同步、断点续传和自定义传输规则,提高文件管理效率。 1. Fla...

  • FlashFXP4.3.1:全面的FTP客户端体验

    本文还有配套的精品资源,点击获取 简介:FlashFXP4.3.1是一款功能全面的FTP客户端软件,专为网站管理员、系统管理员和开发者提供高效、安全的文件上传、下载和管理服务。它支持多种协议,包括基础的FTP,FTPS和SFTP,确保数据传输安全。用户友好的界面设计以及强大的站点管理功能,提供便捷的文件操作。增强功能如断点续传和批量传输,以及高级安全特性如SSH密钥认证,确...

  • 图文讲解FlashFXP(FTP工具) 使用教程

    FlashFTP教程(一)上传网站  FlashFXP是一款功能强大的FXP/FTP软件,如果你使用其它ftp工具受到挫折,就改用这款好用的软件吧(小编使用的是绿盟的FlashFXP绿色版http://www.xdowns.com/soft/1/98/2006/Soft_28711.html)。FlashFXP使用简单,并且有汉化版。  本文介绍FlashFXP最基本的功能,设置站点,上传网站。 

  • FlashFXP,小编带你认识什么是FlashFXP软件

    FlashFXP是一款功能强大的FXP/FTP软件,集成了其它优秀的FTP软件的优点,在进行flashfxp软件使用时,小编还发现了另外一款超级好用的ftp软件:IIS7服务器管理工具。 IIS7服务器管理工具中的ftp功能可以实现批量添加服务器信息,定时任务 (定时上传、定时下载),自动更新功能,大量文件快速加载,边加载边传输,批量连接一键关闭等。 除了ftp功能,IIS7服务器管理工具还可以实现桌面控制、文件存取等系列操作,满足大家对远程控制的个性化需求,支持自定义远程桌面窗口分辨率,支持win、l

  • 全面掌握FTP上传工具:FlashFXP4的使用与技巧

    本文还有配套的精品资源,点击获取 简介:FTP上传工具是用于文件传输的客户端软件,如FlashFXP4。它提供方便、高效的方式上传下载文件到远程服务器。FlashFXP4具备多站点管理、安全连接、断点续传、批量传输、书签功能、直观操作界面、文件比较、权限管理、日志记录以及自定义命令等强大功能。用户在了解服务器信息后,可以通过简单的拖放操作,快速完成文件传输任务。掌握Flas...

  • FlashFXP

    FlashFXP 是一款世界老牌且功能强大的 FXP/FTP 文件传输软件,它融合了其他同类优秀软件的优点,可以像 BpFTP 那样能够缓存文件夹,支持多文件夹选择文件;也可以像 CuteFTP 一样支持彩色文字显示,可比较文件夹;还能够像 LeapFTP 一样的界面风格,甚至设计思路也差相仿佛。 FlashFXP 无论在学习中还是工作中均扮演着重要的角色,网络建站以及网站维护首选可能就是 Fl

  • FlashFXP中文破解 指南

    flashfxp是一款使用非常广泛,功能非常更强大的FXP/FTP软件。它拥有显示彩色文字、比较CuteFTP的目录、上传和下载文件、共享文件等众多功能,其中深受用户喜爱的便是目录比较功能,它能够有效的比较出有哪些文件进行了改动,在网站文件出错时是非常实用的。本次小编为大家附上flashfxp破解版和安装破解教程,并且还有注册码、注册机和破解补丁哦。 安装破解 一、flashfxp安装教程...

  • 鸿子铭:FlashFXP是什么软件,FlashFXP软件怎么用?

    我们直接把这里的这个账号密码以及上传了这个IP地址直接写到这个FlashFXP软件工具上,然后点连接就可以上传网上的一些野马或者是一些模板,插件等等也都是可以的。这个的话我们可以登录网站的后台,然后进制服务器当中,我们就能够获取得到。FlashFXP软件它不需要安装,我们可以直接下载安装在电脑上,打开FlashFXP上传软件,找到它然后的话我们打开它就可以了。因为我们网站当中的话也需要一些其他工具软件去上传的话也会更快的把代码,或者把你想要的模板等快速的上传到网站,把网站快速建成。

  • FlashFXP破解版

    FlashFXP破解版, 不用license,不用key, 直接安装使用

  • 中文破解版flashfxp

    中文破解版flashfxp,解压之后直接运行,再弹出的界面点击输入代码,软件会自动激活,以后就可以一直免费使用,且不再弹出收费提示

Global site tag (gtag.js) - Google Analytics