三、适配问题
1、在widget中,展开、折叠具体是怎么实现的呢?
在NSExtensionContext中,新添了widgetLargestAvailableDisplayMode属性,来确认当前widget是展开还是折叠状态。所以,先在viewWillAppear中设置widget的mode为展开。
代码段1
- (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; self.extensionContext.widgetLargestAvailableDisplayMode = NCWidgetDisplayModeExpanded;}然后,就是展开和折叠的处理了。在NCWidgetProviding协议中,新添了这么个方法widgetActiveDisplayModeDidChange,不赘述,直接用代码示例说明它的用途:
// 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上面的微调,这里暂且不表,聪明的你肯定早就知道解决方案了。但是,不要着急,容我再把自己遇到的坑给家接着叨叨。
- (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遇到同样问题的朋友。