如何在Objective-C中检测Today Widget的展开/收起或"Show More"点击事件?
在Objective-C中检测Today Widget的展开/收起状态及"Show More"点击操作
当然可以!在Objective-C开发Today Widget(也就是iOS的小组件扩展)时,我们完全能检测到它的展开/收起状态变化,以及"Show More"按钮的点击操作——其实后者本质上就是触发了状态切换,咱们一步一步来看怎么实现。
核心实现:利用NCWidgetProviding协议
系统为Widget扩展提供了NCWidgetProviding协议,其中的widgetActiveDisplayModeDidChange:withMaximumSize:方法就是用来监听Widget显示模式变化的核心接口,"Show More"/"Show Less"按钮的点击会直接触发这个状态变化。
完整代码示例
首先,让你的Widget视图控制器遵守NCWidgetProviding协议,然后实现对应的方法:
#import <UIKit/UIKit.h> #import <NotificationCenter/NotificationCenter.h> @interface TodayWidgetVC : UIViewController <NCWidgetProviding> @end @implementation TodayWidgetVC - (void)viewDidLoad { [super viewDidLoad]; // 关键设置:允许Widget切换到展开模式,这样才会显示Show More按钮 self.extensionContext.widgetLargestAvailableDisplayMode = NCWidgetDisplayModeExpanded; } // 监听显示模式变化的核心方法 - (void)widgetActiveDisplayModeDidChange:(NCWidgetDisplayMode)activeDisplayMode withMaximumSize:(CGSize)maxSize { // 根据当前模式调整Widget的内容高度 if (activeDisplayMode == NCWidgetDisplayModeExpanded) { // 展开状态:用户点击了Show More按钮 self.preferredContentSize = CGSizeMake(maxSize.width, 250); // 设置展开后的高度 NSLog(@"Widget已展开,Show More按钮被触发"); // 这里可以添加展开后的逻辑,比如加载更多数据、显示隐藏的UI元素 } else { // 收起状态:用户点击了Show Less按钮 self.preferredContentSize = CGSizeMake(maxSize.width, 100); // 设置收起后的高度 NSLog(@"Widget已收起,Show Less按钮被触发"); // 这里可以添加收起后的逻辑,比如隐藏额外内容、释放不必要的资源 } } @end
关键细节说明
NCWidgetDisplayMode有两个枚举值:NCWidgetDisplayModeCompact:Widget的收起状态,默认高度较矮NCWidgetDisplayModeExpanded:Widget的展开状态,高度更高,需要用户点击"Show More"触发
- 必须在
viewDidLoad中设置widgetLargestAvailableDisplayMode为NCWidgetDisplayModeExpanded,否则Widget会一直处于Compact状态,不会显示"Show More"/"Show Less"按钮 - 每次用户点击"Show More"或"Show Less",系统都会调用
widgetActiveDisplayModeDidChange:withMaximumSize:方法,你可以在这里处理状态变化后的业务逻辑,比如UI调整、数据加载等
内容的提问来源于stack exchange,提问作者DocAsh59
相关产品推荐
相关产品推荐

