iOS Widget的简单实现 demo

 ​

自iOS8之后,苹果支持了扩展(Extension)的开发,开发者可以通过系统提供给我们的扩展接入点 (Extension point) 来为系统特定的服务提供某些附加的功能。今年iOS10的推出,让Widget扩展应用渐渐的火了起来,地位得到重大的提升,从这也可以看出苹果对他的重视,今天我们就来一起学习下Widget,来实现一个简单的扩展程序。

iOS Widget的简单实现_ios

程序效果

                                                       iOS Widget的简单实现_扩展程序_02

创建Widget程序

  • 创建工程,在工程中添加扩展程序

iOS Widget的简单实现_封装_03


iOS Widget的简单实现_扩展程序_04

  • 创建成功后的目录

iOS Widget的简单实现_扩展程序_05

顺便说一句,扩展程序虽然是程序的扩展,但是这两个应用其实是“独立”的。准确的来说,它们是两个独立的进程,默认情况下互相不应该知道对方的存在。扩展需要对宿主 app (host app,即调用该扩展的 app) 的请求做出响应,当然,通过进行配置和一些手段,我们可以在扩展中访问和共享一些容器 app 的资源,这个我们稍后再说。

Widget布局方式


  • 使用Interface Builder
    工程默认的方式就是使用Interface Builder,如果实现简单的布局的话可以考虑这种方式。

  • 使用代码进行布局
    当涉及到比较复杂的UI布局的时候,可以考虑使用这种布局方式,按大家平时的习惯来。这里需要注意一下,如果需要使用代码布局的话需要修改一下plist文件。


首先将原有​​NSExtensionMainStoryboard​​字段删除,添加字段​​NSExtensionPrincipalClass​​,value是你所写的controller的名称,一般默认的都是​​TodayViewController​

iOS Widget的简单实现_ios_06

实现相应的方法

1. 设置Widget的size 

iOS10之后,Widget支持展开及折叠两种展现方式,通过设置​​widgetLargestAvailableDisplayMode​

属性可以让Widget程序实现展开布局。如下:

- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.

if (isIOS10)
{
self.extensionContext.widgetLargestAvailableDisplayMode = NCWidgetDisplayModeExpanded;
}

self.preferredContentSize = CGSizeMake(kWidgetWidth, 110);
}

2. 重写切换展开及折叠布局时的方法(iOS10之后)

 

- (void)widgetActiveDisplayModeDidChange:(NCWidgetDisplayMode)activeDisplayMode withMaximumSize:(CGSize)maxSize
{
NSLog(@"maxWidth %f maxHeight %f",maxSize.width,maxSize.height);

if (activeDisplayMode == NCWidgetDisplayModeCompact)
{
self.preferredContentSize = CGSizeMake(maxSize.width, 110);
}
else
{
self.preferredContentSize = CGSizeMake(maxSize.width, 200);
}
}

 

3. iOS10之前,视图原点默认存在一个间距,可以实现以下方法来调整视图间距

​注:​​该方法在iOS10之后被遗弃,iOS10默认不存在间距。

 

- (UIEdgeInsets)widgetMarginInsetsForProposedMarginInsets:(UIEdgeInsets)defaultMarginInsets
{
return UIEdgeInsetsMake(0, 10, 0, 10);
}

应用唤醒

本来想叫应用间跳转的,想想还是这个名字比较高大上些


编外话


 可以查询到作者发布在 code4app 上面的代码,作者都开放心态支持大家试用提 bug 哦!支持小编整理的也可以将代码分享出去和点赞大拇指 +1,只有大家的支持,才能构建更好,更开放的代码共享平台!加油!


 


POPULAR ARTICLE 

 ​



iOS Widget的简单实现_扩展程序_07关注本公众号,学习 iOS 开发