服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - IOS - iOS 10 Today Widget解析

iOS 10 Today Widget解析

2021-01-30 17:29三月米果 IOS

这篇文章主要为大家详细解析了iOS 10 Today Widget,说一说iOS 10的适配问题,感兴趣的小伙伴们可以参考一下

一、前言

    前面一篇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的折叠界面。

iOS 10 Today Widget解析

三、适配问题

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

?
1
2
3
4
- (void)viewwillappear:(bool)animated {
 [super viewwillappear:animated];
 self.extensioncontext.widgetlargestavailabledisplaymode = ncwidgetdisplaymodeexpanded;
}

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

?
1
2
3
4
5
6
7
8
9
// 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

?
1
2
3
4
- (void)viewwillappear:(bool)animated {
 [super viewwillappear:animated];
 [self.extensioncontext setvalue:@"1" forkey:@"widgetlargestavailabledisplaymode"];
}

代码段4相对于代码段2

?
1
2
3
4
5
6
7
- (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的更新要在主线程操作哈!!!比如酱紫:

?
1
2
3
4
//通知主线程刷新
dispatch_async(dispatch_get_main_queue(), ^{
 //...........;
});

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

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

原文链接:http://www.jianshu.com/p/9b3d06236d19

延伸 · 阅读

精彩推荐
  • IOS解析iOS开发中的FirstResponder第一响应对象

    解析iOS开发中的FirstResponder第一响应对象

    这篇文章主要介绍了解析iOS开发中的FirstResponder第一响应对象,包括View的FirstResponder的释放问题,需要的朋友可以参考下...

    一片枫叶4662020-12-25
  • IOS关于iOS自适应cell行高的那些事儿

    关于iOS自适应cell行高的那些事儿

    这篇文章主要给大家介绍了关于iOS自适应cell行高的那些事儿,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的...

    daisy6092021-05-17
  • IOSiOS 雷达效果实例详解

    iOS 雷达效果实例详解

    这篇文章主要介绍了iOS 雷达效果实例详解的相关资料,需要的朋友可以参考下...

    SimpleWorld11022021-01-28
  • IOSiOS通过逆向理解Block的内存模型

    iOS通过逆向理解Block的内存模型

    自从对 iOS 的逆向初窥门径后,我也经常通过它来分析一些比较大的应用,参考一下这些应用中某些功能的实现。这个探索的过程乐趣多多,不仅能满足自...

    Swiftyper12832021-03-03
  • IOSIOS 屏幕适配方案实现缩放window的示例代码

    IOS 屏幕适配方案实现缩放window的示例代码

    这篇文章主要介绍了IOS 屏幕适配方案实现缩放window的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要...

    xiari5772021-06-01
  • IOSiOS中tableview 两级cell的展开与收回的示例代码

    iOS中tableview 两级cell的展开与收回的示例代码

    本篇文章主要介绍了iOS中tableview 两级cell的展开与收回的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    J_Kang3862021-04-22
  • IOSIOS开发之字典转字符串的实例详解

    IOS开发之字典转字符串的实例详解

    这篇文章主要介绍了IOS开发之字典转字符串的实例详解的相关资料,希望通过本文能帮助到大家,让大家掌握这样的方法,需要的朋友可以参考下...

    苦练内功5832021-04-01
  • IOSiOS布局渲染之UIView方法的调用时机详解

    iOS布局渲染之UIView方法的调用时机详解

    在你刚开始开发 iOS 应用时,最难避免或者是调试的就是和布局相关的问题,下面这篇文章主要给大家介绍了关于iOS布局渲染之UIView方法调用时机的相关资料...

    windtersharp7642021-05-04