小部件:图像小部件测试应用程序

扩展名有照片,共享,自定义键盘等几种类型。扩展名是iOS 8中引入的功能,非常受欢迎。 我们将专注于其中之一。 今天的扩展也称为小部件,并描述简单的实现。 让我们解释一下关于小部件的细节。

首先,今天和其他扩展都是简单的“子”应用,它们正在扩展“父”应用,因此不能单独分发。 今天的扩展程序可以为用户提供快速信息,如日程安排,天气,阅读最多的新闻。 他们必须具有更新的内容,具有低内存使用率的简单UI,因为用户通常可以具有多个扩展名,已打开并且系统将立即终止使用过多内存的扩展名。 互动是有限的。 没有键盘访问权限。

理论足够,让我们开始执行。 打开Xcode,然后在“文件”菜单中选择“新建”>“项目…”(将其作为编程语言)。 创建项目后,打开“文件”菜单,然后选择“新建”>“目标”,然后在“ Aplication Extension”部分中选择“ Today Extension”。

在出现有关为扩展创建新方案的警报后,只需单击“激活”。 Xcode将为您创建一个新的.storyboard文件(默认情况下为MainInterface.storyboard),UIViewController类(默认情况下为TodayViewController)和另一个Info.plist文件。 在Info.plist文件中,我们可以在Bundle显示名称键下更改扩展名,并设置更长,更具描述性的名称。

扩展仅是StoryBoard和UIViewController,它具有所有可用的方法(viewDidLoad(),viewDidAppear()…)。

要设置高度值,我们可以使用preferredContentSize来设置所需的高度。 宽度的最大值将是屏幕的宽度。 将self.extensionContext?.widgetLargestAvailableDisplayMode = .expanded添加到viewDidLoad()以在扩展视图上添加“更多/更少”按钮。 我们必须实现widgetActiveDisplayModeDidChange(_ activeDisplayMode:NCWidgetDisplayMode,withMaximumSize maxSize:CGSize)协议方法,该方法将在按下“更多/更少”按钮时被调用,扩展大小可以根据该方法中的状态进行设置。

widgetActiveDisplayModeDidChange(_ activeDisplayMode:NCWidgetDisplayMode,withMaximumSize maxSize:CGSize)是NCWidgetProviding协议的一部分,稍后我们将提及(func widgetMarginInsets(forProposedMarginInsets defaultMarginInsets:UIEdgeInsets)-> UIEdgeInsets在iOS 10中已弃用)。

在继续之前,请打开MainInterface.storyboard。 将另一个UILabel和UIImageView添加到控制器,并将它们连接到TodayViewController类。 将高度和宽度的固定约束添加到UIImage,并使用垂直约束添加居中,并在标题UILabel和字幕UILabel中添加底部,顶部,前导,尾随。

之后,我们可以在类的扩展中添加简单的数据获取方法。 将用于从响应中获取URL的响应数据和UIImage数据。

设置图片网址以获取json数据。

创建用于解析和存储响应数据的结构。

添加用于用新数据更新UI的简单方法。

将在viewDidLoad()和widgetPerformUpdate(completionHandler:(@escaping(NCUpdateResult)-> Void))中设置fetchData()。 当扩展名不在屏幕上时,它用于更新视图,更新取决于将在完成处理程序中返回的常量(NCUpdateResult.newData,NCUpdateResult.noData,NCUpdateResult.failed)。 为了隐藏空内容并在收到内容时取消隐藏,我们还可以使用setHasContent(_标志:Bool,forWidgetWithBundleIdentifier bundleID:String),在其中传递确定内容状态的布尔值。

现在我们可以运行该应用程序,并且应该看到类似于此视图的简单视图。

开启网址

如今,扩展程序(窗口小部件)是轻量级的,可以显示基本信息,并且如果用户希望进行更多交互,则将其转移至应用程序是一种好习惯。 对于这种传输,我们通常使用UIApplication.sharedApplication()。openURL(url),但由于扩展名不是应用程序,因此没有可用的UIApplication对象。 代替的是扩展上下文执行相同的操作extensionContext?.openURL(url,completionHandler:((Bool)-> Void)?) 我们必须在应用程序中设置url方案,然后在扩展程序中调用该url,否则设备上的其他应用程序将打开。

在TodayViewController界面中添加按钮,并将IBAction连接到类。 在操作方法中,调用打开url方法extensionContext?.open(URL(string:“ TestTodayExtension://”)!, completionHandler:nil)。 我们现在可以运行我们的小部件,然后尝试通过按钮操作来打开应用。 使用url方案,我们可以通过处理在应用程序中打开应用程序来打开应用程序中的特定屏幕(_ app:UIApplication,打开url:URL,选项:[UIApplicationOpenURLOptionsKey:Any] = [:])-> AppDelegate类中的Bool。

关于小部件的结论

希望这将有助于解决有关今日小部件扩展的一些问题。 此示例的代码在此链接上。 如果您想更深入,Apple Docs中有很多有关扩展的信息。