iOS 10 Today Widget解析

所属分类: 软件编程 / IOS 阅读数: 1233
收藏 0 赞 0 分享

一、前言

    前面一篇iOS开发之widget实现文章说到了如何在iOS 8.0-9.3上实现widget,可是iOS 10已经来袭,不了解一下iOS 10,把widget适配上去,说不过去呀!所以,本篇文章就接着说下iOS 10上面Today Widget的坑坑洼洼。

二、Today Widget新特性

    安装完iOS 10的beta版本,发现苹果越发重视widget了:快速浏览,及时从喜爱的应用中了解信息,如图1所示。
    现在,从锁屏页面,下拉通知栏的第一页,还有左滑主页面都可以进入widget。通过右上角的“展开”、“折叠”按钮,可以查看widget的全部内容和部分内容。在6s上面,点击应用icon的3D Touch界面中,也会有widget的折叠界面。

三、适配问题

1、在widget中,展开、折叠具体是怎么实现的呢?
    在NSExtensionContext中,新添了widgetLargestAvailableDisplayMode属性,来确认当前widget是展开还是折叠状态。所以,先在viewWillAppear中设置widget的mode为展开。
代码段1

- (void)viewWillAppear:(BOOL)animated {
 [super viewWillAppear:animated];
 self.extensionContext.widgetLargestAvailableDisplayMode = NCWidgetDisplayModeExpanded;
}

    然后,就是展开和折叠的处理了。在NCWidgetProviding协议中,新添了这么个方法widgetActiveDisplayModeDidChange,不赘述,直接用代码示例说明它的用途:
代码段2

// If implemented, called when the active display mode changes.
// The widget may wish to change its preferredContentSize to better accommodate the new display mode.
- (void)widgetActiveDisplayModeDidChange:(NCWidgetDisplayMode)activeDisplayMode withMaximumSize:(CGSize)maxSize {
 if (activeDisplayMode == NCWidgetDisplayModeCompact) {
  self.preferredContentSize = CGSizeMake([UIScreen mainScreen].bounds.size.width, 110);
 } else {
  self.preferredContentSize = CGSizeMake([UIScreen mainScreen].bounds.size.width, 300);
 }
}

    到这里,你可以在iOS 10上面看到带有展开、折叠功能的widget了,具体UI上面的微调,这里暂且不表,聪明的你肯定早就知道解决方案了。但是,不要着急,容我再把自己遇到的坑给家接着叨叨。

2、启动app后,第一次显示的是折叠,而不是展开呢?
    这个问题,归咎于preferredContentSize的设置,确认widget的mode之前,不要设置这个值。我的处理方式是:在widgetActiveDisplayModeDidChange中设置展开或折叠状态下widget的高度,就如上面的代码段2一样(当然,我的项目里比这个处理要复杂的多,这里化繁为简只为示例),iOS 10环境下在这里设置高度也就足够了。

3、为什么有时展开或折叠"失灵"了,没有对应的展开或折叠呢?
    这个问题的前提,肯定是你展开、折叠对应的widget高度不一样,只是看到了右上角按钮内容改变,但高度却没有变。
    这个问题的原因在于,点击展开、折叠按钮修改了widget的mode之后,却没有设置对应的高度:preferredContentSize。怎么办呢?再回到代码段2,mode改变后,设置对应状态下的高度即可。

4、如何用XCode 7.3打出能够适配iOS 10的widget呢?
    适配完iOS 10,会发现代码中总不能用XCode 8.0 beta打包代码吧,可是用XCode 7.3打包代码也编译不过啊,widgetLargestAvailableDisplayMode和NCWidgetDisplayMode都是iOS 10的产物。
    用kvc试试看?对,就是kvc。闲言不表,直接看代码吧:
代码段3 相对于 代码段1

- (void)viewWillAppear:(BOOL)animated {
 [super viewWillAppear:animated];
 [self.extensionContext setValue:@"1" forKey:@"widgetLargestAvailableDisplayMode"];
}

代码段4相对于代码段2

- (void)widgetActiveDisplayModeDidChange:(NSInteger)activeDisplayMode withMaximumSize:(CGSize)maxSize {
 if (activeDisplayMode == 0) {
  self.preferredContentSize = CGSizeMake([UIScreen mainScreen].bounds.size.width, 110);
 } else {
  self.preferredContentSize = CGSizeMake([UIScreen mainScreen].bounds.size.width, 300);
 }
}

5、切记:UI的更新要在主线程操作哈!!!比如酱紫:

//通知主线程刷新
dispatch_async(dispatch_get_main_queue(), ^{
 //...........;
});

好了,我在适配widget过程的问题就这些了,希望可以帮助正在开发widget遇到同样问题的朋友。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

更多精彩内容其他人还在看

iOS开发笔记--详解UILabel的相关属性设置

这篇文章主要介绍了iOS开发笔记--详解UILabel的相关属性设置,对初学者具有一定的参考价值,有需要的可以了解一下。
收藏 0 赞 0 分享

iOS中获取系统相册中的图片实例

这篇文章主要介绍了iOS中获取系统相册中的图片实例,具有一定的参考价值没有需要的朋友可以了解一下。
收藏 0 赞 0 分享

iOS 检测网络状态的两种方法

一般有Reachability和AFNetworking监测两种方式,都是第三方的框架,下文逐一详细给大家讲解,感兴趣的朋友一起看看吧
收藏 0 赞 0 分享

IOS 性能优化中离屏渲染

本文主要介绍了IOS 性能优化中离屏渲染的资料,提供了几种方法讲解了优化,有需要的小伙伴可以参考下
收藏 0 赞 0 分享

iOS获取当前设备型号等信息(全)包含iPhone7和iPhone7P

这篇文章主要介绍了iOS获取当前设备型号设备信息的总结包含iPhone7和iPhone7P,包括ios7之前之后的获取方式,本文接的非常详细,具有参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

iOS实现爆炸的粒子效果示例代码

之前在网上看到了一个Android实现的爆炸效果,感觉非常不错,所以自己尝试用iOS来实现下效果,现在将实现的过程、原理以及遇到的问题分享给大家,有需要的朋友们可以参考借鉴,下面来一起看看吧。
收藏 0 赞 0 分享

iOS毕业设计之天气预报App

这篇文章主要为大家详细介绍了iOS毕业设计之天气预报App,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

iOS轻点、触摸和手势代码开发

这篇文章主要为大家详细介绍了iOS轻点、触摸和手势代码开发,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

iOS 实现多代理的方法及实例代码

这篇文章主要介绍了iOS 实现多代理的方法及实例代码的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

iOS文字渐变色效果的实现方法

在大家日常开发iOS的过程中,可能会遇到要实现文字渐变色的效果,这篇文章文章通过示例代码和详细的步骤介绍了如何利用iOS实现文字渐变色的效果,实现后的很不错,感兴趣的朋友们下面来一起看看吧。
收藏 0 赞 0 分享
查看更多