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 ...
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.
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.
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
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
}
Es gibt zwei Möglichkeiten, die Erweiterung "Heute" anzuzeigen:
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
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;}