iOS 7 简介

本文介绍 iOS 7 中引入的主要新 API,包括视图控制器转换、UIView 动画、UIKit 动态和文本工具包的增强功能。 它还介绍了用户界面的一些更改,以及新的迷人的多任务功能。

iOS 7 是 iOS 的主要更新。 它引入了一个全新的用户界面设计,使焦点放在内容而不是应用程序版式上。 除了视觉更改之外,iOS 7 还添加了大量新 API,以创建更丰富的交互和体验。 本文档调查 iOS 7 中引入的新技术,并作为进一步探索的起点。

UIView 动画增强功能

iOS 7 增强了 UIKit 中的动画支持,使应用程序能够执行以前需要直接放入核心动画框架的事情。 例如,UIView 现在可以执行春季动画和关键帧动画,而关键帧动画以前 CAKeyframeAnimation 已应用于该 CALayer 动画。

Spring Animations

UIView 现在支持使用春季效果对属性更改进行动画处理。 若要添加此功能,请调用 AnimateNotifyAnimateNotifyAsync 方法,传入弹簧阻尼比和弹簧初始速度的值,如下所示:

  • springWithDampingRatio – 介于 0 和 1 之间的值,其中振荡增加较小的值。
  • initialSpringVelocity – 弹簧初始速度,作为每秒动画总距离的百分比。

当图像视图的中心发生更改时,以下代码将产生春季效果:

void AnimateWithSpring ()
{
    float springDampingRatio = 0.25f;
    float initialSpringVelocity = 1.0f;

    UIView.AnimateNotify (3.0, 0.0, springDampingRatio, initialSpringVelocity, 0, () => {

        imageView.Center = new CGPoint (imageView.Center.X, 400);

    }, null);
}

此弹簧效果导致图像视图在将动画完成到新的中心位置时出现反弹,如下所示:

此弹簧效果导致图像视图在完成移动到新的中心位置的动画时出现反弹

关键帧动画

UIView 类现在包括用于在 UIView 上创建关键帧动画的 AnimateWithKeyframes方法。 此方法与其他 UIView 动画方法类似,只是附加的 NSAction 作为参数传递以包含关键帧。 在 NSAction 中,通过调用 UIView.AddKeyframeWithRelativeStartTime来添加关键帧。

例如,以下代码片段创建关键帧动画来设置视图中心动画以及旋转视图:

void AnimateViewWithKeyframes ()
{
    var initialTransform = imageView.Transform;
    var initialCeneter = imageView.Center;

    // can now use keyframes directly on UIView without needing to drop directly into Core Animation

    UIView.AnimateKeyframes (2.0, 0, UIViewKeyframeAnimationOptions.Autoreverse, () => {
        UIView.AddKeyframeWithRelativeStartTime (0.0, 0.5, () => {
            imageView.Center = new CGPoint (200, 200);
        });

        UIView.AddKeyframeWithRelativeStartTime (0.5, 0.5, () => {
            imageView.Transform = CGAffineTransform.MakeRotation ((float)Math.PI / 2);
        });
    }, (finished) => {
        imageView.Center = initialCeneter;
        imageView.Transform = initialTransform;

        AnimateWithSpring ();
    });
}

AddKeyframeWithRelativeStartTime 方法的前两个参数分别将关键帧的开始时间和持续时间指定为总体动画长度的百分比。 上面的示例使图像视图在第一秒内动画化到其新中心,然后在接下来的第二秒内旋转 90 度。 由于动画将 UIViewKeyframeAnimationOptions.Autoreverse 指定为选项,因此关键帧也会反向进行动画处理。 最后,最终值设置为完成处理程序中的初始状态。

下面的屏幕截图演示了通过关键帧组合的动画:

此屏幕截图演示了通过关键帧组合的动画

UIKit Dynamics

UIKit Dynamics 是 UIKit 中的一组新 API,允许应用程序基于物理创建动画交互。 UIKit Dynamics 封装 2D 物理引擎,使这成为可能。

API 本质上是声明性的。 通过创建对象(称为行为)来声明物理交互的行为方式,以表达物理概念,如重力、碰撞、泉水等。然后将行为附加到另一个对象,称为动态动画器,该动态动画器封装视图。 动态动画器负责将声明的物理行为应用于动态项 -实现 IUIDynamicItem 的项,例如 UIView

有多种不同的基元行为可用于触发复杂交互,包括:

  • UIAttachmentBehavior – 附加两个动态项,以便它们一起移动,或将动态项目附加到附件点。
  • UICollisionBehavior – 允许动态项参与碰撞。
  • UIDynamicItemBehavior – 指定要应用于动态项的一组常规属性,例如弹性、密度和摩擦。
  • UIGravityBehavior - 将重力应用于动态项,导致项目在引力方向加速。
  • UIPushBehavior – 对动态项应用力。
  • UISnapBehavior – 允许动态项捕捉到具有春季效果的位置。

尽管有许多基元,但使用 UIKit Dynamics 将基于物理的交互添加到视图的常规过程在行为上是一致的:

  1. 创建动态动画器。
  2. 创建行为。
  3. 向动态动画器添加行为。

Dynamics 示例

让我们看看向 UIView 添加重力和碰撞边界的示例。

UIGravityBehavior

向图像视图添加重力遵循上面概述的 3 个步骤。

我们将在此示例的 ViewDidLoad 方法中工作。 首先,添加 UIImageView 实例,如下所示:

image = UIImage.FromFile ("monkeys.jpg");

imageView = new UIImageView (new CGRect (new CGPoint (View.Center.X - image.Size.Width / 2, 0), image.Size)) {
                    Image =  image
                }

View.AddSubview (imageView);

这会创建以屏幕上边缘居中的图像视图。 若要使图像“以重力下降”,请创建一个 UIDynamicAnimator 实例:

dynAnimator = new UIDynamicAnimator (this.View);

UIDynamicAnimator 采用引用 UIViewUICollectionViewLayout 的实例,其中包含将按附加行为进行动画处理的项。

接下来,创建 UIGravityBehavior 实例。 可以传递实现 IUIDynamicItem 的一个或多个对象,例如 UIView

var gravity = new UIGravityBehavior (dynItems);

此行为传递 IUIDynamicItem 数组,在本例中包含要进行动画处理的单个 UIImageView 实例。

最后,将行为添加到动态动画器:

dynAnimator.AddBehavior (gravity);

这会导致图像以重力向下动画,如下所示:

起始图像位置结束图像位置

由于没有任何限制屏幕边界,因此图像视图只是从底部掉下来。 若要约束视图,使图像与屏幕边缘相撞,我们可以添加 UICollisionBehavior。 我们将在下一部分中介绍这一点。

UICollisionBehavior

我们将首先创建一个 UICollisionBehavior 并将其添加到动态动画器,就像我们对 UIGravityBehavior 所做的那样。

修改代码以包含 UICollisionBehavior

using (image = UIImage.FromFile ("monkeys.jpg")) {

    imageView = new UIImageView (new CGRect (new CGPoint (View.Center.X - image.Size.Width / 2, 0), image.Size)) {
        Image =  image
    };

    View.AddSubview (imageView);

    // 1. create the dynamic animator
    dynAnimator = new UIDynamicAnimator (this.View);

    // 2. create behavior(s)
    var gravity = new UIGravityBehavior (imageView);
    var collision = new UICollisionBehavior (imageView) {
        TranslatesReferenceBoundsIntoBoundary = true
    };

    // 3. add behaviors(s) to the dynamic animator
    dynAnimator.AddBehaviors (gravity, collision);
}

UICollisionBehavior 有一个名为 TranslatesReferenceBoundsIntoBoundry 的属性。 将此项设置为 true 会导致引用视图的边界用作碰撞边界。

现在,当图像以重力向下动画时,它会稍微从屏幕底部弹跳,然后确定在那里休息。

UIDynamicItemBehavior

我们可以通过其他行为进一步控制下降图像视图的行为。 例如,我们可以添加一个 UIDynamicItemBehavior 来增加弹性,导致图像视图在与屏幕底部相撞时反弹更多。

添加 UIDynamicItemBehavior 遵循与其他行为相同的步骤。 首先创建行为:

var dynBehavior = new UIDynamicItemBehavior (dynItems) {
    Elasticity = 0.7f
};

然后,将行为添加到动态动画器:

dynAnimator.AddBehavior (dynBehavior);

有了此行为,图像视图在与边界相撞时会反弹更多。

常规用户界面更改

除了上述新的 UIKit API(如 UIKit Dynamics、控制器转换和增强的 UIView 动画)外,iOS 7 还引入了各种 UI 的视觉更改,以及各种视图和控件的相关 API 更改。 有关详细信息,请参阅 iOS 7 用户界面概述

文本工具包

文本工具包是一个新的 API,提供强大的文本布局和呈现功能。 它构建在低级核心文本框架之上,但比核心文本更容易使用。

有关详细信息,请参阅我们的 TextKit

多任务

iOS 7 更改了执行后台工作的时间和方式。 iOS 7 中的任务完成不再让应用程序在后台运行时保持清醒状态,应用程序会以非连续方式唤醒后台处理。 iOS 7 还添加了三个新 API,用于在后台使用新内容更新应用程序:

  • 后台提取 – 允许应用程序定期更新后台的内容。
  • 远程通知 - 允许应用程序在收到推送通知时更新内容。 通知可以是无提示通知,也可以显示锁屏上的横幅。
  • 后台传输服务 – 允许上传和下载数据(如大型文件),但时间限制固定。

有关新的多任务功能的更多详细信息,请参阅 Xamarin 后台指南的 iOS 部分。

总结

本文介绍 iOS 的几个主要新增功能。 首先,它演示如何向视图控制器添加自定义转换。 然后,它演示如何在集合视图中使用转换,无论是从导航控制器内部,还是以交互方式在集合视图之间。 接下来,它引入了 UIView 动画的多项增强功能,显示应用程序如何使用 UIKit 直接针对核心动画进行编程。 最后,新的 UIKit Dynamics API(将物理引擎引入 UIKit)与文本工具包框架中现在提供的丰富文本支持一起引入。