iOS 10刚刚发布,就迫不及待的更了beta版,新版的widget这里改动比较大,就料到这里有坑。更完果然崩了...特意查看了一下别家的App,除了系统自带的天气发现基本全都跪了。

刚考完编译,决定放松一下踩个坑。
在网上搜了一下关于这块的东西,发现除了官网少的可怜的就给说了多了一个NCWidgetDisplayMode,别的就什么都没说,应该是还没更好文档吧。好吧,强迫症犯了,那就先自己踩这个坑吧。
既然多了这个模式,那就去头文件里找一下吧。
在头文件NCWidgetProviding.h发现多了如下定义

@interface NSExtensionContext (NCWidgetAdditions)
// Widgets can change the largest display mode they make available from the default 'NCWidgetDisplayModeCompact' by messaging the extension context.
// Modifying this property more than once during the lifetime of the widget (perhaps due to changes in the amount of available content) is supported.
@property (nonatomic, assign) NCWidgetDisplayMode widgetLargestAvailableDisplayMode NS_AVAILABLE_IOS(10_0);
@property (nonatomic, assign, readonly) NCWidgetDisplayMode widgetActiveDisplayMode NS_AVAILABLE_IOS(10_0);

- (CGSize)widgetMaximumSizeForDisplayMode:(NCWidgetDisplayMode)displayMode NS_AVAILABLE_IOS(10_0);
@end

NCWidgetProviding这个协议里面还添加了这个方法

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

那这就不难理解了,
先在viewWillAppear里面添加如下,来表明自己的widget是可以展开的,按照注释里面写的来讲,这个最好经常赋值,所以就我暂且就把它放到了viewWillAppear里了。

self.extensionContext.widgetLargestAvailableDisplayMode = NCWidgetDisplayModeExpanded;

然后实现协议

- (void)widgetActiveDisplayModeDidChange:(NCWidgetDisplayMode)activeDisplayMode
                         withMaximumSize:(CGSize)maxSize {
    switch (activeDisplayMode) {
        case NCWidgetDisplayModeExpanded:
            self.preferredContentSize = CGSizeMake(0,HeaderHeight+_todayCourses.count*CourseWidgetCellHeight);
            break;
        case NCWidgetDisplayModeCompact:
            self.preferredContentSize = CGSizeMake(0, HeaderHeight);
    }
}

另外需要注意的一点,注意把之前在别的地方设置self.preferredContentSize的代码不要再进行设置。就像我是把这个设置写在了tableView:numberOfRowsInSection:里以每次课表更新的时候都会更新大小,如果每次都运行这个的话,会导致我每次打开widget页面的时候,第一次展开失效。

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    NSInteger count = [_todayCourses count];
    if([[[UIDevice currentDevice] systemVersion] floatValue] < 10) {
        self.preferredContentSize = CGSizeMake(0,HeaderHeight+count*CourseWidgetCellHeight);
    }
    return count;
}

运行一下看下效果,这时看到已经多了展开按钮,点击一下,就可以展开了。

view看起来很奇怪,修正一下。

对了,iOS 10的特性,当你设置完self.extensionContext.widgetLargestAvailableDisplayMode = NCWidgetDisplayModeExpanded;之后,3D Touch那里会自动显示widget。
效果如下:

唔,不知道为什么,有了这个的时候,自定义的ICON貌似没加载出来。
= =这应该是暂时系统的bug吧,如果没有这个widget的话,ICON是显示正常的。

有个吐槽的地方,新版的Today Widget的初始大小是固定的,这就导致默认提供的便利变得非常有限,如果每次还需要点击展开,这明显会麻烦很多。当然这就是后续需要重新考虑这里更适合放什么,而不是简简单单兼容就完事了。坑就踩到这。
默默继续复习准备期末了。