web-dev-qa-db-ja.com

Todayウィジェット拡張の高さを設定する方法は?

通知センターでアプリのToday拡張機能の高さを変更するにはどうすればよいですか?

Interface BuilderとCodeで試してみましたが、Interface Builderはビューを高さ600で表示しますが、デバイスにこの高さを適用していません。

私はそれを約80ピクセルより大きくすることはできないようです...

enter image description here

38
Gotschi

ウィジェットでUIViewController.m(Objective-C):

self.preferredContentSize = CGSizeMake(0, 200);

ウィジェットの高さは200になります。

ウィジェットは、自動的に処理される通知センターの正確な幅に収まらなければならないため、幅はビューに影響を与えないことに注意してください。

また、ビューの高さの変化をアニメーション化する場合は、(Objective-C)を実装できます:

- (void)viewWillTransitionToSize:(CGSize)size
       withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator

-animateAlongsideTransition:completion:

答えは少し隠されていました。最終的に この素晴らしいドキュメント を見つけるには、ドキュメントのサイドバーをクリックする必要がありました。


別の方法は、 auto-layout constraint を使用してビューの高さを制限することです。

76
Santa Claus

ウィジェットの高さはシステムによって調整されます。制約を使用して高さを定義した場合、これは必要に応じて自動的に調整されます。明示的なレイアウトを使用している場合、ウィジェットのpreferredContentSizeを変更して新しい高さを要求できます。

通知センターが高さの要求を尊重することを保証するものではないことに注意してください:自動的に調整される場合がありますが、希望の正確な高さに調整されない場合があります。

ウィジェットを開発する最良の方法は、自動レイアウト制約を使用して高さの値を設定することです。これにより、ウィジェットは異なる高さに簡単に適応します。

16
lxt

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

15
Lion

最善の方法はもちろん自動レイアウトですが、デフォルトではこのように制御できるマージンがあります

func widgetMarginInsetsForProposedMarginInsets
    (defaultMarginInsets: UIEdgeInsets) -> (UIEdgeInsets) {
    return UIEdgeInsetsZero
}
10
Aleš Kocur

Today拡張機能を表示するには、2つの方法があります。

  1. コンパクトモード(ウィジェットの固定高さ)
  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を参照してください。

8
fAiSaL

TodayウィジェットのデフォルトUIEdgeInsets defaultMarginInsets(UIEdgeInsets)defaultMarginInsets =(上= 0、左= 44、下= 39、右= 0)

このメソッドを追加する必要があります

- (UIEdgeInsets)widgetMarginInsetsForProposedMarginInsets:(UIEdgeInsets)defaultMarginInsets {
UIEdgeInsets edgeInsets = UIEdgeInsetsMake(0, 44, 0, 0);
return edgeInsets;}
1
Vivek