webentwicklung-frage-antwort-db.com.de

Wie stelle ich die Höhe einer Today Widget Extension ein?

Wie kann ich die Höhe der Heute-Erweiterung meiner App im Benachrichtigungscenter ändern?

Ich habe es mit dem Interface Builder und mit Code versucht. Der Interface Builder zeigt die Ansicht mit der Höhe 600 an, wendet diese Höhe jedoch nicht auf das Gerät an.

Es scheint, dass ich es nicht größer als etwa 80 Pixel bekommen kann ...

enter image description here

38
Gotschi

In deinem Widget UIViewController.m (Ziel c):

self.preferredContentSize = CGSizeMake(0, 200);

Wird Ihr Widget eine Höhe von 200 haben.

Beachten Sie, dass die Breite keinen Einfluss auf die Ansicht hat, da Widgets genau in die Breite des Benachrichtigungscenters passen müssen, die automatisch verarbeitet wird.

Wenn Sie Änderungen in der Höhe Ihrer Ansicht animieren möchten, können Sie Folgendes implementieren (Objective-C):

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

in Ihrem View Controller mit -animateAlongsideTransition:completion:

Die Antwort war etwas versteckt; Sie mussten sich in der Seitenleiste der Dokumentation umsehen, um dieses fantastische Dokument zu finden.


Eine andere Möglichkeit ist die Verwendung von automatische Layouteinschränkungen , um die Höhe Ihrer Ansicht zu beschränken.

76
Santa Claus

Widgets werden vom System in der Höhe angepasst. Wenn Sie Ihre Höhe mit Einschränkungen definiert haben, wird dies automatisch nach Bedarf angepasst. Wenn Sie ein explizites Layout verwenden, können Sie eine neue Höhe anfordern, indem Sie das preferredContentSize Ihres Widgets ändern.

Beachten Sie, dass Sie keine Garantiemitteilungszentrale haben, die Ihre Höhenanforderung berücksichtigt: Möglicherweise wird sie automatisch angepasst, möglicherweise jedoch nicht auf die gewünschte Höhe, oder sie wird möglicherweise überhaupt nicht eingehalten.

Die beste Möglichkeit, ein Widget zu entwickeln, besteht darin, die Werte für die Höhe mithilfe von Einschränkungen für das automatische Layout festzulegen. Auf diese Weise kann das Widget problemlos an unterschiedliche Höhen angepasst werden.

16
lxt

Seit iOS 10 beträgt die Höhe der Extension 110 Pixel. Sie sollten die neue Protokollmethode widgetActiveDisplayModeDidChange:withMaximumSize: Verwenden, um die Erweiterungsgröße zu erweitern (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;
    }
}

Außerdem müssen Sie möglicherweise setWidgetLargestAvailableDisplayMode: In Ihrem Erweiterungskontext in der viewDidLoad -Methode des heutigen View-Controllers wie folgt aufrufen (Objective-C):

if ([self.extensionContext respondsToSelector:@selector(setWidgetLargestAvailableDisplayMode:)]) { // iOS 10+
    [self.extensionContext setWidgetLargestAvailableDisplayMode:NCWidgetDisplayModeExpanded];
} else {
    self.preferredContentSize = CGSizeMake(0, 600.0); // iOS 10-
}

Dieser Thread kann hilfreich sein https://forums.developer.Apple.com/thread/489

15
Lion

Der beste Weg ist natürlich Autolayout, aber standardmäßig gibt es Ränder, die Sie so steuern können

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

Es gibt zwei Möglichkeiten, die Erweiterung "Heute" anzuzeigen:

  1. Kompaktmodus (feste Höhe für Widget)
  2. Erweiterungsmodus (Variable Höhe für Widget)

Was auch immer Sie tun, um die Ausdehnungshöhe im Kompaktmodus zu ändern, spielt keine Rolle. Sie müssen also den Modus von Kompakt auf Erweitern ändern.

// 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);
  }
}

Weitere Updates zu App-Erweiterungen finden Sie im WWDC

8
fAiSaL

Heute Widget Standard UIEdgeInsets defaultMarginInsets (UIEdgeInsets) defaultMarginInsets = (oben = 0, links = 44, unten = 39, rechts = 0)

Sie sollten diese Methode hinzufügen

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