iOS 10 中的搜索和主屏幕小组件增强功能
本文介绍 Apple 在 iOS 10 中对小组件系统的增强功能。
Apple 为小组件系统引入了多项增强功能,以确保小组件在新 iOS 10 锁屏界面上的任何背景中都能呈现出色的效果。 此外,小组件现在包含一个 NCWidgetDisplayMode 属性,该属性允许开发人员描述有多少内容可用,并允许用户展开和折叠内容。
小组件(也称为“今日扩展”)是一种特殊的 iOS 扩展类型,可显示少量有用信息或及时公开特定于应用的功能。 例如,新闻应用具有一个显示头条新闻的小组件,日历应用提供两个不同的小组件:一个用于显示今天的事件,另一个用于显示即将发生的事件。
小组件高度可自定义,可能包含 UI 元素,例如文本、图像、按钮等。此外,开发人员还可以进一步自定义其小组件的布局。
用户可以查看和与应用小组件进行交互的两个主要位置:
- 搜索屏幕 - 用户可以添加他们在搜索屏幕中查找最有用的小组件。 通过在主屏幕和锁屏界面上向右轻扫来访问“搜索”屏幕。
- 主屏幕 - 从主屏幕中,用户可以使用 3D Touch 打开快速操作列表,方法是向应用的图标应用施加压力。 应用的小组件将显示在快速操作列表上方。 有关详细信息,请参阅我们的 3D Touch 简介文档。
小组件开发人员建议
理想情况下,开发人员应始终尝试设计用户希望添加到其搜索屏幕的小组件。 为此,Apple 给出了以下建议:
- 创建出色的概览体验 - 用户希望小组件提供状态更新的简短、概览信息,或者允许它们快速执行简单任务。 这使得提供正确的信息和交互性至关重要。 尽可能允许用户通过一次点击来执行给定的任务。 此外,由于小组件不支持平移或滚动,因此必须在小组件的设计中考虑到这一点。
- 快速显示内容 - 小组件设计为一目了然,因此在显示小组件后,用户永远不必等待内容加载。 小组件应在本地缓存其内容,以便在后台加载新内容时显示最新内容。
- 提供适当的填充和边距 - 小组件不应看起来拥挤,因此避免将内容扩展到小组件的视图边缘。 边缘和内容之间应始终有一些像素宽边距。 Apple 还建议使用小组件顶部显示的应用图标作为对齐指南。 如果小组件显示网格布局,请确保网格中的项之间有适当的填充,并尝试将项数限制为 4 个最大值。
- 使用自适应布局 - 小组件的宽度因正在运行的设备和设备的方向而异。 小组件的高度也可能因处于折叠状态(默认值)或展开(不受所有小组件支持)状态显示而有所不同。 折叠的小组件的高度大致为两个半标准 iOS 表行。 开发人员可以请求扩展小组件的大小,但理想情况下它应小于屏幕的高度。 在折叠状态下,小组件应仅显示基本独立信息。 展开时,小组件应显示补充信息,以增强折叠状态中显示的主要内容。 “快速操作列表”中显示的小组件将仅处于折叠状态。
- 请勿自定义小组件的背景 - 小组件显示在系统提供的浅色模糊背景上。 这样做是为了促进小组件之间的一致性并提高其内容的可读性。 避免将图像用作小组件背景,因为它可能会与用户的锁屏和主屏幕壁纸冲突。
- 使用黑色或深灰色的系统字体 - 在小组件中显示文本时,系统字体效果最佳。 字体应为黑色或深灰色,以突出浅色、模糊的小组件背景。
- 在适当的时候提供应用访问 - 小组件的操作应始终与其应用分开操作,但是,如果需要更深层次的功能,小组件应能够启动应用以查看或编辑特定信息片段。 从不包括“打开应用”按钮,只需允许用户点击内容本身,再也不会打开第三方应用。
- 选择清晰简洁的小组件名称 - 应用图标和小组件的名称始终显示在小组件的内容上。 Apple 建议将应用的名称用于其主要小组件,并为它提供的任何其他内容提供简洁明了的名称。 提供自定义小组件标题时,应以应用名称(如“附近的地图”、“地图餐厅”等)作为前缀。
- 身份验证添加值时通知 - 如果仅当用户进行身份验证并登录时,才提供其他功能或信息,请向用户显示此信息。 例如,拼车应用可能会说“登录预订行程”。
- 选择快速操作列表小组件 - 如果应用提供多个小组件,开发人员应选择当用户使用 3D Touch 向应用图标施加压力来显示快速操作列表时要呈现的小组件。
有关使用小组件的详细信息,请参阅我们的扩展简介、3D Touch 简介文档和 Apple 的应用扩展编程指南。
使用 Vibrancy
Vibrancy 确保小组件的文本在小组件光线、模糊背景(由系统提供)上显示时保持清晰。 在 iOS 10 之前,开发人员会使用 NotificationCenterVibrancyEffect 作为小组件的活力。 例如:
// DEPRECATED: Get Widget Vibrancy Effect
var vibrancy = UIVibrancyEffect.CreateForNotificationCenter ();
这已在 iOS 10 中弃用,应替换为 WidgetPrimaryVibrancyEffect 或 WidgetSecondaryVibrancyEffect。 例如:
// Get Primary Widget Vibrancy Effect
var vibrancy = UIVibrancyEffect.CreatePrimaryVibrancyEffectForNotificationCenter ();
// Get Secondary Widget Vibrancy Effect
var vibrancy2 = UIVibrancyEffect.CreateSecondaryVibrancyEffectForNotificationCenter ();
使用折叠和展开的小组件
作为 iOS 10 的新特性,小组件现在包含 NCWidgetDisplayMode 属性,使开发人员能够描述可用内容量并允许用户展开和折叠内容。
最初显示小组件时,它处于折叠状态。 折叠的小组件的高度大致为两个半标准 iOS 表行。 开发人员可以请求扩展小组件的大小,但理想情况下它应小于屏幕的高度。
在折叠状态下,小组件应仅显示基本独立信息。 展开时,小组件应显示补充信息,以增强折叠状态中显示的主要内容。 例如,天气应用显示折叠时的当前天气条件,并在展开时添加每小时预测。
“快速操作列表”中显示的小组件将仅处于折叠状态。 如果应用提供多个小组件,开发人员应选择当用户使用 3D Touch 向应用图标施加压力来显示快速操作列表时要显示的小组件。
以下示例是一个简单的“今日扩展”(小组件),用于处理折叠状态和展开状态:
using System;
using NotificationCenter;
using Foundation;
using UIKit;
using CoreGraphics;
namespace MonkeyAbout
{
public partial class TodayViewController : UIViewController, INCWidgetProviding
{
protected TodayViewController (IntPtr handle) : base (handle)
{
// Note: this .ctor should not contain any initialization logic.
}
public override void ViewDidLoad ()
{
base.ViewDidLoad ();
// Tell widget it can be expanded
ExtensionContext.SetWidgetLargestAvailableDisplayMode (NCWidgetDisplayMode.Expanded);
// Get the maximum size
var maxSize = ExtensionContext.GetWidgetMaximumSize (NCWidgetDisplayMode.Expanded);
}
[Export ("widgetPerformUpdateWithCompletionHandler:")]
public void WidgetPerformUpdate (Action<NCUpdateResult> completionHandler)
{
// Take action based on the display mode
switch (ExtensionContext.GetWidgetActiveDisplayMode()) {
case NCWidgetDisplayMode.Compact:
Content.Text = "Let's Monkey About!";
break;
case NCWidgetDisplayMode.Expanded:
Content.Text = "Gorilla!!!!";
break;
}
// Report results
// If an error is encoutered, use NCUpdateResultFailed
// If there's no update required, use NCUpdateResultNoData
// If there's an update, use NCUpdateResultNewData
completionHandler (NCUpdateResult.NewData);
}
[Export ("widgetActiveDisplayModeDidChange:withMaximumSize:")]
public void WidgetActiveDisplayModeDidChange (NCWidgetDisplayMode activeDisplayMode, CGSize maxSize)
{
// Take action based on the display mode
switch (activeDisplayMode) {
case NCWidgetDisplayMode.Compact:
PreferredContentSize = maxSize;
Content.Text = "Let's Monkey About!";
break;
case NCWidgetDisplayMode.Expanded:
PreferredContentSize = new CGSize (0, 200);
Content.Text = "Gorilla!!!!";
break;
}
}
}
}
详细查看小组件显示模式特定代码。 若要通知系统此小组件支持展开状态,它使用:
// Tell widget it can be expanded
ExtensionContext.SetWidgetLargestAvailableDisplayMode (NCWidgetDisplayMode.Expanded);
若要获取小组件的当前显示模式,它使用:
ExtensionContext.GetWidgetActiveDisplayMode()
若要获取折叠状态或展开状态的最大大小,它使用:
// Get the maximum size
var maxSize = ExtensionContext.GetWidgetMaximumSize (NCWidgetDisplayMode.Expanded);
为了处理状态(显示模式)更改,它使用:
[Export ("widgetActiveDisplayModeDidChange:withMaximumSize:")]
public void WidgetActiveDisplayModeDidChange (NCWidgetDisplayMode activeDisplayMode, CGSize maxSize)
{
// Take action based on the display mode
switch (activeDisplayMode) {
case NCWidgetDisplayMode.Compact:
PreferredContentSize = maxSize;
Content.Text = "Let's Monkey About!";
break;
case NCWidgetDisplayMode.Expanded:
PreferredContentSize = new CGSize (0, 200);
Content.Text = "Gorilla!!!!";
break;
}
}
除了为每个状态设置请求的大小(折叠或展开),它还更新要显示的内容以匹配新大小。
总结
本文介绍了 Apple 在 iOS 10 中对小组件系统所做的增强,并介绍了如何在 Xamarin.iOS 中实现它们。