通知センターでアプリのToday拡張機能の高さを変更するにはどうすればよいですか?
Interface BuilderとCodeで試してみましたが、Interface Builderはビューを高さ600で表示しますが、デバイスにこの高さを適用していません。
私はそれを約80ピクセルより大きくすることはできないようです...
ウィジェットでUIViewController.m
(Objective-C):
self.preferredContentSize = CGSizeMake(0, 200);
ウィジェットの高さは200になります。
ウィジェットは、自動的に処理される通知センターの正確な幅に収まらなければならないため、幅はビューに影響を与えないことに注意してください。
また、ビューの高さの変化をアニメーション化する場合は、(Objective-C)を実装できます:
- (void)viewWillTransitionToSize:(CGSize)size
withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
-animateAlongsideTransition:completion:
答えは少し隠されていました。最終的に この素晴らしいドキュメント を見つけるには、ドキュメントのサイドバーをクリックする必要がありました。
ウィジェットの高さはシステムによって調整されます。制約を使用して高さを定義した場合、これは必要に応じて自動的に調整されます。明示的なレイアウトを使用している場合、ウィジェットの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;
}
}
また、今日のビューコントローラーのviewDidLoad
メソッドで、拡張コンテキストでsetWidgetLargestAvailableDisplayMode:
を呼び出す必要があるかもしれません(Objective-C):
if ([self.extensionContext respondsToSelector:@selector(setWidgetLargestAvailableDisplayMode:)]) { // iOS 10+
[self.extensionContext setWidgetLargestAvailableDisplayMode:NCWidgetDisplayModeExpanded];
} else {
self.preferredContentSize = CGSizeMake(0, 600.0); // iOS 10-
}
このスレッドは役に立つかもしれません https://forums.developer.Apple.com/thread/489
最善の方法はもちろん自動レイアウトですが、デフォルトではこのように制御できるマージンがあります
func widgetMarginInsetsForProposedMarginInsets
(defaultMarginInsets: UIEdgeInsets) -> (UIEdgeInsets) {
return UIEdgeInsetsZero
}
Today拡張機能を表示するには、2つの方法があります。
コンパクトモードで拡張の高さを変更するためにどのようなコードを実行しても、違いは生じません。そのため、モードをコンパクトから拡張モードに変更する必要があります。
// 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を参照してください。
TodayウィジェットのデフォルトUIEdgeInsets defaultMarginInsets(UIEdgeInsets)defaultMarginInsets =(上= 0、左= 44、下= 39、右= 0)
このメソッドを追加する必要があります
- (UIEdgeInsets)widgetMarginInsetsForProposedMarginInsets:(UIEdgeInsets)defaultMarginInsets {
UIEdgeInsets edgeInsets = UIEdgeInsetsMake(0, 44, 0, 0);
return edgeInsets;}