Ios 如何设置今日小部件扩展的高度?
如何在通知中心更改应用程序的“今日”扩展的高度 我用界面生成器和代码进行了尝试, Interface Builder显示高度为600的视图,但未在设备上应用此高度 看起来我不能让它超过80像素Ios 如何设置今日小部件扩展的高度?,ios,ios8,xcode6,ios-app-extension,Ios,Ios8,Xcode6,Ios App Extension,如何在通知中心更改应用程序的“今日”扩展的高度 我用界面生成器和代码进行了尝试, Interface Builder显示高度为600的视图,但未在设备上应用此高度 看起来我不能让它超过80像素 小部件的高度由系统调整。如果已使用约束定义了高度,将根据需要自动调整高度。如果您使用的是显式布局,您可以通过修改小部件的preferredContentSize请求新高度 请注意,您无法保证notification center会尊重您的身高要求:它可能会自动调整,也可能会调整,但不会调整到您想要的确切高
小部件的高度由系统调整。如果已使用约束定义了高度,将根据需要自动调整高度。如果您使用的是显式布局,您可以通过修改小部件的
preferredContentSize
请求新高度
请注意,您无法保证notification center会尊重您的身高要求:它可能会自动调整,也可能会调整,但不会调整到您想要的确切高度,或者可能根本不会遵守
开发小部件的最佳方法是使用自动布局约束来设置高度值,这样小部件可以轻松适应不同的高度。在小部件中
UIViewController.m
(Objective-C):
将使您的小部件具有200的高度
请注意,宽度对视图没有影响,因为小部件必须适合自动处理的notification center的确切宽度
此外,如果要设置视图高度更改的动画,可以实现(Objective-C):
-(void)视图大小:(CGSize)大小
withTransitionCoordinator:(id)协调员
在视图控制器中使用
答案有点隐晦;您必须在文档侧栏中单击才能最终找到
另一种方法是使用约束视图的高度。
当然,最好的方法是自动布局,但默认情况下,您可以像这样控制页边距
func widgetMarginInsetsForProposedMarginInsets
(defaultMarginInsets: UIEdgeInsets) -> (UIEdgeInsets) {
return UIEdgeInsetsZero
}
今天,小部件默认UIEdgeInsets defaultMarginInsets (UIEdgeInsets)defaultMarginInsets=(顶部=0,左侧=44,底部=39,右侧=0) 您应该添加此方法
- (UIEdgeInsets)widgetMarginInsetsForProposedMarginInsets:(UIEdgeInsets)defaultMarginInsets {
UIEdgeInsets edgeInsets = UIEdgeInsetsMake(0, 44, 0, 0);
return edgeInsets;}
因为iOS 10扩展的高度是110像素。您应该使用新的协议方法
widgetActiveDisplayModeDidChange:withMaximumSize:
扩展扩展大小(Objective-C):
此外,您可能需要在今天视图控制器的viewDidLoad
方法中的扩展上下文上调用setwidgetlagestavailabledisplaymode:
,如下所示(Objective-C):
此线程可能会有所帮助有两种方式显示今日扩展:
// 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+1以获取解释,并感谢您的回答!但不幸的是,自动布局在这种情况下对我不起作用:/如果您在自动布局中遇到问题,而没有更新扩展的高度,我会尝试1)使用Xcode中的新调试工具可视化约束(以确保您的约束正在做您认为它们正在做的事情),如果一切看起来都很好,2)归档错误,因为它应该“正常工作”。这是一个非常有用的答案。这解释了为什么我的小部件并不像我期望的那样有说服力。但是你在哪里读到的?我已经阅读了所有的Today extensions文档,我不记得读过系统可能会决定它是否应该是大的。它位于Notification Center框架的头文件中。如何在IB中设置自动布局的高度约束?我有我今天的VC和它的视图,但是我不能在视图上设置高度约束。视图有两个子视图,我已经设置了这些约束…这不是推荐的方法。如会话中所述,您应该使用自动布局。@Isiahturner谢谢。我还没有机会在线观看昨天的会议……preferredContentSize在横向模式下工作不好。看起来没有足够的空间放置小部件@SantaClaus能否与auto layout分享一些设置高度的代码?
WidgetActiveDisplayModedChange
仅适用于iOS 10及以上版本。请记住,iPad上的小部件大小(紧凑/扩展)不同。现在记不起确切的值,但它们比iPhone的小部件大小大。您还需要设置extensionContext?.widgetLargestAvailableDisplayMode=.expanded
,才能获得扩展模式。那么,如果我们想同时支持iOS10以下和iOS10以上,我们应该如何设置它呢?@Lion,它适合我,但我也想滚动我的小部件,因为我已经使用tableview来显示我的内容,并且我有一个数据列表要在小部件中显示。如果你有什么想法,可以帮我吗?
- (UIEdgeInsets)widgetMarginInsetsForProposedMarginInsets:(UIEdgeInsets)defaultMarginInsets {
UIEdgeInsets edgeInsets = UIEdgeInsetsMake(0, 44, 0, 0);
return edgeInsets;}
- (void)widgetActiveDisplayModeDidChange:(NCWidgetDisplayMode)activeDisplayMode
withMaximumSize:(CGSize)maxSize {
if (activeDisplayMode == NCWidgetDisplayModeExpanded) {
self.preferredContentSize = CGSizeMake(maxSize.width, 600.0);
} else if (activeDisplayMode == NCWidgetDisplayModeCompact) {
self.preferredContentSize = maxSize;
}
}
if ([self.extensionContext respondsToSelector:@selector(setWidgetLargestAvailableDisplayMode:)]) { // iOS 10+
[self.extensionContext setWidgetLargestAvailableDisplayMode:NCWidgetDisplayModeExpanded];
} else {
self.preferredContentSize = CGSizeMake(0, 600.0); // iOS 10-
}
// 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);
}
}