轻松掌握:iOS小部件的简易开发教程

更新:11-08 民间故事 我要投稿 纠错 投诉

大家好,关于轻松掌握:iOS小部件的简易开发教程很多朋友都还不太明白,今天小编就来为大家分享关于的知识,希望对各位有所帮助!

Widget布局方式

使用界面生成器

该项目的默认方式是使用Interface Builder。如果你想实现一个简单的布局,可以考虑这种方式。使用代码布局

当涉及到比较复杂的UI布局时,可以考虑使用这种布局方式,遵循大家平时的习惯。这里需要注意的是,如果需要使用代码布局,需要修改plist文件。

首先删除原来的NSExtensionMainStoryboard字段,添加字段NSExtensionPrincipalClass。值是您编写的控制器的名称。一般默认是TodayViewController。修改plist文件

实现相应的方法

1. 设置Widget的size。 iOS10之后,Widget支持展开和折叠两种显示方式。通过设置widgetLargestAvailableDisplayMode属性,Widget程序可以实现扩展布局。如下:

- (void)viewDidLoad {

[超级viewDidLoad];

//从笔尖加载视图后进行任何其他设置。

如果(是IOS10)

{

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);

}

别的

{

self.preferredContentSize=CGSizeMake(maxSize.width, 200);

}

}3. iOS10之前,视图原点默认存在一个间距,可以实现以下方法来调整视图间距注:iOS10之后该方法被废弃,iOS10默认没有间距。

- (UIEdgeInsets)widgetMarginInsetsForProfusedMarginInsets:(UIEdgeInsets)defaultMarginInsets

{

返回UIEdgeInsetsMake(0, 10, 0, 10);

}

应用唤醒

本来想叫它应用间跳转,但是想了想,这个名字更加高贵。

如下,配置url方案。定义这个的时候,尽量不要和其他用途冲突。作者将其定义为WidgetDemo。这样就可以通过访问WidgetDemo:来唤醒应用程序了。代码如下:

配置url 方案- (void)redButtonPressed:(UIButton *)button

{

NSLog(@"%s",__func__);

NSURL *url=[NSURL URLWithString:@"WidgetDemo://红色"];

[self.extensionContext openURL:url finishHandler:^(BOOL 成功) {

NSLog(@"isSuccessed %d",成功);

}];

相应地,在AppDelegate中实现以下方法。在这里您可以处理传递的操作并对不同的传递值执行不同的操作。这里我们打印请求url的内容。

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication 注释:(id)注释

{

if ([[url AbsoluteString] hasPrefix:@"WidgetDemo"])

{

UIAlertView *alert=[[UIAlertView alloc] initWithTitle:@"提示" message:[NSString stringWithFormat:@"您单击了%@ 按钮",[url host]] delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];

[警报显示];

}

返回是;

}简单的应用程序快速启动器

既然我们正在谈论应用程序唤醒,那么让我们稍微扩展一下它。相信大家都用过启动器这样的应用程序快速启动器。事实上,它利用了应用程序之间跳转的原理。每个应用程序都有一个定制的url 方案。只要知道他们的url schema,我们就可以跳转到修改后的应用,比如跳转到微信: - (void)wechatLoginButtonPressed

{

NSLog(@"%s",__func__);

NSURL *url=[NSURL URLWithString:@"wechat://"];

[self.extensionContext openURL:url finishHandler:^(BOOL 成功) {

NSLog(@"isSuccessed %d",成功);

}];

}下面是我们常用软件的url方案。有兴趣的同学可以尝试一下:

QQ mqq://微信weixin://淘宝taobao://微博sinaweibo://支付宝alipay://

数据共享

扩展程序一般不会独立于宿主程序运行,不可避免地需要与宿主程序进行数据交互。与普通APP相比,数据可以使用单例、NSUserDefault等。但是,由于扩展程序和宿主应用程序是两个完全独立的应用程序,并且iOS应用程序基于沙箱限制,因此一般的数据共享方法无法实现数据共享。这里需要使用应用程序组。

分别打开宿主程序和扩展程序中的App Group,并设置一个组名称。这里,请确保主机APP和分机APP的groupName相同。设置应用组

两种数据存储方式

使用NSUserDefault[NSUserDefaults standardUserDefaults];此处不能使用方法来初始化NSUserDefault 对象。前面提到,由于沙箱机制的原因,扩展应用程序是不允许访问宿主应用程序的沙箱路径的,所以上面的用法是不正确的。您需要使用应用程序组来实例化UserDefaults。正确的用法如下:

写入数据NSUserDefaults *userDefaults=[[NSUserDefaults alloc] initWithSuiteName:@"group.com.japho.widgetDemo"];

[userDefaults setObject:self.textField.text forKey:@"widget"];

[用户默认同步];读取数据NSUserDefaults *userDefaults=[[NSUserDefaults alloc] initWithSuiteName:@"group.com.japho.widgetDemo"];

self.contentStr=[userDefaults objectForKey:@"widget"];通过NSFileManager共享数据写入数据-(BOOL)通过NSFileManager保存数据

{

NSError *err=nil;

NSURL *containerURL=[[NSFileManager defaultManager]containerURLForSecurityApplicationGroupIdentifier:@"group.com.xxx"];

containerURL=[containerURL URLByAppendingPathComponent:@"Library/Caches/widget"];

NSString *value=@"asdfasdfasf";

BOOL 结果=[值writeToURL:containerURL 原子地:YES 编码:NSUTF8StringEncoding 错误:err];

如果(!结果)

{

NSLog(@"%@",错误);

}

别的

{

NSLog(@"保存值:%@成功。",value);

}

返回结果;

}读取数据-(NSString *)通过NSFileManager读取数据

{

NSError *err=nil;

NSURL *containerURL=[[NSFileManager defaultManager]containerURLForSecurityApplicationGroupIdentifier:@"group.com.xxx"];

containerURL=[containerURL URLByAppendingPathComponent:@"Library/Caches/widget"];

NSString *value=[NSString stringWithContentsOfURL:containerURL 编码: NSUTF8StringEncoding error:err];

返回值;

}

其他

补充:启动小部件还需要单独申请APP ID。您需要配置证书和配置文件文件。

当没有配置相关证书时:

配置证书和描述文件:(列举一些)

用户评论

凉凉凉”凉但是人心

我想试试看自己也能做个小Widget!

    有10位网友表示赞同!

为爱放弃

最近对iOS开发有兴趣,可以关注一下这篇文章学习?

    有19位网友表示赞同!

炙年

是不是要做一些常用的功能进去比较方便啊?

    有18位网友表示赞同!

琴断朱弦

简单实现就更好上手了,希望能详细点说明步骤吧。

    有14位网友表示赞同!

寂莫

Widget做的精巧也挺好玩的,感觉用户体验会更佳。

    有5位网友表示赞同!

余温散尽ぺ

我之前一直听说过Widget,现在终于有时间学习一下了!

    有17位网友表示赞同!

放肆丶小侽人

想做一个天气预报的Widget,这个教程可以参考吗?

    有10位网友表示赞同!

歆久

做Widget真的比我想象中难很多吗?

    有18位网友表示赞同!

凉笙墨染

iOS开发好像越来越有趣了。

    有8位网友表示赞同!

灵魂摆渡人

希望能有更多不同类型Widget的实现方法!

    有8位网友表示赞同!

莫飞霜

Widget的功能也太丰富了吧,这篇文章能让我入门吗?

    有18位网友表示赞同!

久爱不厌

学习一下Widget的开发,说不定可以提高我的App体验!

    有5位网友表示赞同!

将妓就计

这篇文章应该会对初学者比较友好吧?

    有20位网友表示赞同!

颜洛殇

不知道可以用什么工具来做Widget呢?

    有18位网友表示赞同!

无寒

简单实现的关键点是什么呢?

    有19位网友表示赞同!

坠入深海i

看看能不能用到SwiftUI框架来实现?

    有7位网友表示赞同!

太难

感觉学习一下Widget可以帮我更好地理解iOS开发。

    有9位网友表示赞同!

我家的爱豆是怪比i

这个教程是不是也适合安卓的Widget呢?

    有12位网友表示赞同!

浮殇年华

期待看到更多关于iOS Widget的文章!

    有20位网友表示赞同!

浮世繁华

我要快点学会做Widget,然后分享给我的朋友们!

    有18位网友表示赞同!

【轻松掌握:iOS小部件的简易开发教程】相关文章:

1.蛤蟆讨媳妇【哈尼族民间故事】

2.米颠拜石

3.王羲之临池学书

4.清代敢于创新的“浓墨宰相”——刘墉

5.“巧取豪夺”的由来--米芾逸事

6.荒唐洁癖 惜砚如身(米芾逸事)

7.拜石为兄--米芾逸事

8.郑板桥轶事十则

9.王献之被公主抢亲后的悲惨人生

10.史上真实张三丰:在棺材中竟神奇复活

上一篇:五大话费充值平台比较:揭秘最低价话费充值渠道 下一篇:《寻找心灵共振伴侣:与频率同步的ta相遇》