web-dev-qa-db-fra.com

Quelle est la hauteur du nouveau widget / extension iOS 10 Today?

Je suis en train de créer un widget iOS Aujourd'hui, et lors des tests pour iOS 10, j'ai remarqué que tous les widgets reçoivent maintenant la même hauteur (les versions précédentes permettaient au développeur de définir la hauteur). Quelle est la hauteur idéale/quelle est la meilleure pratique pour faire face à cette nouvelle limitation? Je suis en Swift et je n'ai pas utilisé autolayout fyi. Merci d'avance!

23
user3658503

Dans iOS 10, par défaut, la hauteur du widget d'aujourd'hui est fixe. De plus, la hauteur minimale du widget réduit est limitée.

Un widget réduit est la hauteur d'environ deux lignes et demie de table. Un widget étendu n'est idéalement pas plus haut que la hauteur de l'écran.

Ces notes proviennent de iOS Human Interface Guidelines .

Nous pouvons faire ce qui suit pour le changer.

Tout d'abord, vous devez ajouter ces codes dans votre viewDidLoad, cela rend votre widget compatible avec deux modes qui sont nouveaux dans iOS 10.

Version Swift:

if #available(iOSApplicationExtension 10.0, *) { // Xcode would suggest you implement this.
    extensionContext?.widgetLargestAvailableDisplayMode = .expanded
} else {
    // Fallback on earlier versions
}

Version ObjC:

self.extensionContext.widgetLargestAvailableDisplayMode = NCWidgetDisplayModeExpanded;

Et puis implémentez la méthode de protocole comme:

Version Swift:

@available(iOSApplicationExtension 10.0, *)
func widgetActiveDisplayModeDidChange(activeDisplayMode: NCWidgetDisplayMode, withMaximumSize maxSize: CGSize) {
    if activeDisplayMode == .expanded {
        preferredContentSize = CGSize(width: 0.0, height: 200.0)
    } else if activeDisplayMode == .compact {
        preferredContentSize = maxSize
    }
}

Version ObjC:

- (void)widgetActiveDisplayModeDidChange:(NCWidgetDisplayMode)activeDisplayMode withMaximumSize:(CGSize)maxSize {
    if (activeDisplayMode == NCWidgetDisplayModeExpanded) {
        self.preferredContentSize = CGSizeMake(0.0, 200.0);
    } else if (activeDisplayMode == NCWidgetDisplayModeCompact) {
        self.preferredContentSize = maxSize;
    }
}

Exécutez votre cible, vous verrez un bouton "Afficher plus" dans le coin droit de votre widget. Appuyez dessus et vous verrez le changement.

Voir plus de détails: Comment redimensionner la hauteur du widget dans iOS 10?

43
yys

Le widget dans iOS 10 a été modifié comme vous l'avez remarqué et a maintenant une hauteur fixe. De nouvelles fonctionnalités ont également été ajoutées à l'extension d'aujourd'hui. L'un d'eux est le NCWidgetDisplayMode. Fondamentalement, vous avez un bouton dans le coin droit où vous pouvez "Afficher plus" ou "Afficher moins".

Commencez par ajouter ce qui suit à votre viewDidLoad()

self.preferredContentSize = CGSize(width: 0, height: 200)

if #available(iOSApplicationExtension 10.0, *) {
    self.extensionContext?.widgetLargestAvailableDisplayMode = .expanded
} else {
    // Fallback on earlier versions
}

Ce que vous devez ensuite faire est d'ajouter essentiellement la méthode suivante:

Version Swift:

@available(iOSApplicationExtension 10.0, *)
func widgetActiveDisplayModeDidChange(activeDisplayMode: NCWidgetDisplayMode, withMaximumSize maxSize: CGSize) {
    if activeDisplayMode == NCWidgetDisplayMode.Compact {
        self.preferredContentSize = CGSizeMake(0.0, 200.0)
    }
    else if activeDisplayMode == NCWidgetDisplayMode.Expanded {
        self.preferredContentSize = desiredSize
    }

}

Version Objective-C:

- (void)widgetActiveDisplayModeDidChange:(NCWidgetDisplayMode)activeDisplayMode withMaximumSize:(CGSize)maxSize{
    if (activeDisplayMode == NCWidgetDisplayModeCompact){
        self.preferredContentSize = CGSizeMake(0.0, 200.0);
    }
    else if (activeDisplayMode == NCWidgetDisplayModeExpanded){
        self.preferredContentSize = desiredSize;
    }
}

Notez deux choses ici:

Xcode vous proposera automatiquement d'ajouter la vérification disponible pour la version iOS (pour Swift au moins). Donc, ne supprimez pas l'ancienne façon de procéder self.preferredContentSize = CGSizeMake... Ceci est toujours nécessaire pour les anciennes versions d'iOS.

Dans la widgetActiveDisplayModeDidChangefonction activeDisplayMode == NCWidgetDisplayMode.Compactsera appelé lorsque vous passerez de "Afficher plus"> "Afficher moins". C'est parce qu'il est déclenché immédiatement depuis le système iOS. Et activeDisplayMode == NCWidgetDisplayMode.Expanded sera appelé lorsque vous passerez de "Afficher moins"> "Afficher plus".

Et une dernière chose, il s'agit toujours d'une sorte de buggy avec les boutons "Afficher plus" et "Afficher moins" et ce n'est pas encore corrigé par Apple. Vérifiez la démonstration de Apples Keynote et vous remarquerez qu'il a eu le problème avec ce bug.

9
Rashwan L

Procédez simplement comme suit:

let height = extensionContext?.widgetMaximumSize(for: .compact).height

vous pouvez utiliser les deux: .compact et .expanded les types.

4