如何设置今天的Widget扩展的高度?
如何在通知中心更改应用程序的今日扩展程序的高度?
我用界面生成器和代码尝试了它,界面生成器显示高度为600的视图,但是它没有在设备上应用这个高度。
看来我不能比80像素更大
在你的小部件UIViewController.m
(Objective-C)中:
self.preferredContentSize = CGSizeMake(0, 200);
将使你的部件有200的高度。
请注意,宽度将不会影响视图,因为窗口小部件必须适合自动处理的通知中心的确切宽度。
另外,如果你想animation视图高度的变化,你可以实现(Objective-C):
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
在你的视图控制器中使用animateAlongsideTransition:completion:
答案有点隐藏, 你不得不在文档边栏中点击以最终find这个奇妙的文档 。
另一种方法是使用自动布局约束来约束视图的高度。
小部件的高度由系统调整。 如果您已经使用约束来定义高度,则会根据需要自动调整。 如果您使用显式布局,则可以通过修改widget的preferredContentSize
来请求新的高度。
请注意,你没有保证,通知中心会尊重你的身高要求:它可以自动调整,可以调整,但不是你想要的确切高度,或者可能根本不受尊重。
开发一个小部件的最好方法是使用自动布局约束来设置你的高度值,这样你的小部件将轻松地适应不同的高度。
由于iOS 10扩展的高度是110像素。 您应该使用新的协议方法widgetActiveDisplayModeDidChange:withMaximumSize:
扩展扩展大小(Objective-C):
- (void)widgetActiveDisplayModeDidChange:(NCWidgetDisplayMode)activeDisplayMode withMaximumSize:(CGSize)maxSize { if (activeDisplayMode == NCWidgetDisplayModeExpanded) { self.preferredContentSize = CGSizeMake(maxSize.width, 600.0); } else if (activeDisplayMode == NCWidgetDisplayModeCompact) { self.preferredContentSize = maxSize; } }
你也许需要在你的扩展上下文中调用setWidgetLargestAvailableDisplayMode:
在今天的视图控制器的viewDidLoad
方法像这样(Objective-C):
if ([self.extensionContext respondsToSelector:@selector(setWidgetLargestAvailableDisplayMode:)]) { // iOS 10+ [self.extensionContext setWidgetLargestAvailableDisplayMode:NCWidgetDisplayModeExpanded]; } else { self.preferredContentSize = CGSizeMake(0, 600.0); // iOS 10- }
最好的方法当然是Autolayout,但是默认情况下有这样的边距可以控制
func widgetMarginInsetsForProposedMarginInsets (defaultMarginInsets: UIEdgeInsets) -> (UIEdgeInsets) { return UIEdgeInsetsZero }
有两种方法可以显示今天的延伸:
- 紧凑模式(Widget固定高度)
- 展开模式(可变高度的小工具)
无论您在Compact模式下更改扩展高度的代码都不会有任何区别。 所以您需要将模式从紧凑模式更改为展开模式。
// 1. Load This in viewDidLoad: override func viewDidLoad() { super.viewDidLoad() self.extensionContext?.widgetLargestAvailableDisplayMode = NCWidgetDisplayMode.expanded } // 2. Implement another widget protocol func widgetActiveDisplayModeDidChange(_ activeDisplayMode: NCWidgetDisplayMode, withMaximumSize maxSize: CGSize){ if (activeDisplayMode == NCWidgetDisplayMode.compact) { self.preferredContentSize = maxSize; } else { self.preferredContentSize = CGSize(width: 0, height: 200); } }
您可以参考WWDC获取有关附加应用信息的更多信息
今天小部件默认UIEdgeInsets defaultMarginInsets(UIEdgeInsets)defaultMarginInsets =(top = 0,left = 44,bottom = 39,right = 0)
你应该添加这个方法
- (UIEdgeInsets)widgetMarginInsetsForProposedMarginInsets:(UIEdgeInsets)defaultMarginInsets { UIEdgeInsets edgeInsets = UIEdgeInsetsMake(0, 44, 0, 0); return edgeInsets;}