美文网首页iOS
iOS Widget 的基本使用

iOS Widget 的基本使用

作者: L小杰 | 来源:发表于2016-12-12 15:04 被阅读102次

扩展如何运作、Extension和Containing App、host app之间的关系、Containing App与扩展共享数据、开启App Groups
Containing App 包含widget的app
host app 宿主app,对于today widget来说,host app就是today

1.创建Extension
 点击“File”->”New”->”Target”
创建出的TodayViewController同样需要配置一套配置文件,和之前的操作相同

1.png
2.widget里唤醒主程序,通过url schemes
NSString *urlStr = @"xjwidgetapp://red"; NSURL *url = [NSURL URLWithString:urlStr]; [self.extensionContext openURL:url completionHandler:^(BOOL success) { }];
3.在host app 宿主和today widget中开启app groups 这样才能进行数据交互。
//存储 NSUserDefaults *shared = [[NSUserDefaults alloc] initWithSuiteName:@"group.com.lxjfmdb.app"]; [shared setObject:@"orange" forKey:@"key"]; [shared synchronize];
//读取 NSUserDefaults *shared = [[NSUserDefaults alloc] initWithSuiteName:@"group.com.lxjfmdb.app"]; NSString *str = [shared objectForKey:@"key"]; NSLog(@"%@",str);
4.widget生命周期

如果用户是第一次下拉查看Widget其实就是执行整个ViewController生命周期调用过程。
系统为了保证Widget上数据是及时更新的,默认会截取上次显示成功Widget的快照.这个快照会一直保存到新的数据或UI被更新才回被替换,那这就会带来一个问题,当你拖拽通知中心(Notification Center)下拉过于频繁时,Debug跟踪代码执行路径你会发现整个Widget生命周期执行过程和第一次下拉执行的路径发生了变化.
第一次下拉执行路径是viewDidLoad->viewWillAppear,而如果下拉过于频繁你就会发现代码执行路径直接只会执行viewWillAppear方法,这个就是系统默认保存上次快照而导致的执行路径上变化.这对我们选择NSTimer更新时机以及后面会提到的Widget横竖屏处理都会有影响.

在viewwillappear里调用数据请求和设置界面高度
// 设置界面的高度

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

-(void)widgetActiveDisplayModeDidChange:(NCWidgetDisplayMode)activeDisplayMode 方法里设置高度

-(void)widgetActiveDisplayModeDidChange:(NCWidgetDisplayMode)activeDisplayMode withMaximumSize:(CGSize)maxSize{
    if (activeDisplayMode == 0) {
        self.preferredContentSize = CGSizeMake([UIScreen mainScreen].bounds.size.width, 110 );///这里的110是苹果设置死的,应该不能改吧
    } else {
        self.preferredContentSize = CGSizeMake([UIScreen mainScreen].bounds.size.width, 110 * 4);//这里的总高度可以自己设置
    }
}

TodayViewController同样支持cocoapod,一样可以进行数据请求

platform :ios, ‘8.0’
target ‘TodayViewController’ do
    
pod 'AFNetworking'

pod 'MJExtension'
end

基本上widget就能接入成功了

相关文章

网友评论

    本文标题:iOS Widget 的基本使用

    本文链接:https://www.haomeiwen.com/subject/crmmmttx.html