web-dev-qa-db-fra.com

Comment définir la hauteur d'une extension de widget aujourd'hui?

Comment puis-je modifier la hauteur de l'extension Today de mon application dans le centre de notifications?

Je l'ai essayé avec l'Interface Builder et avec le Code, l'Interface Builder affiche la vue avec une hauteur de 600, mais il n'applique pas cette hauteur sur l'appareil.

Il semble que je ne puisse pas dépasser 80 pixels ...

enter image description here

38
Gotschi

Dans votre widget UIViewController.m (Objectif c):

self.preferredContentSize = CGSizeMake(0, 200);

Fera votre widget avoir une hauteur de 200.

Notez que la largeur n'aura aucun effet sur la vue, car les widgets doivent tenir dans la largeur exacte du centre de notification, qui est géré automatiquement.

De plus, si vous souhaitez animer des changements de hauteur de votre vue, vous pouvez implémenter (Objective-C):

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

dans votre contrôleur de vue en utilisant -animateAlongsideTransition:completion:

La réponse était un peu cachée; vous avez dû cliquer dans la barre latérale de documentation pour finalement trouver ce document fantastique .


Une autre façon consiste à utiliser contraintes de mise en page automatique pour limiter la hauteur de votre vue.

76
Santa Claus

Les widgets ont leurs hauteurs ajustées par le système. Si vous avez défini votre hauteur à l'aide de contraintes, celle-ci sera automatiquement ajustée selon les besoins. Si vous utilisez une disposition explicite, vous pouvez demander une nouvelle hauteur en modifiant le preferredContentSize de votre widget.

Notez que vous n'avez aucune garantie que le centre de notification respectera votre demande de hauteur: il peut être ajusté automatiquement, il peut être ajusté mais pas à la hauteur exacte que vous souhaitez, ou il peut ne pas être honoré du tout.

La meilleure façon de développer un widget est d'utiliser des contraintes de mise en page automatique pour définir vos valeurs de hauteur, de sorte que votre widget s'adaptera facilement à différentes hauteurs.

16
lxt

Depuis la hauteur de l'extension iOS 10 est de 110 pixels. Vous devez utiliser une nouvelle méthode de protocole widgetActiveDisplayModeDidChange:withMaximumSize: pour étendre la taille de l'extension (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;
    }
}

Vous devrez peut-être également appeler setWidgetLargestAvailableDisplayMode: sur le contexte de votre extension dans la méthode viewDidLoad du contrôleur de vue actuelle comme celle-ci (Objective-C):

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

Ce fil peut être utile https://forums.developer.Apple.com/thread/489

15
Lion

La meilleure façon est bien sûr Autolayout mais par défaut il y a des marges que vous pouvez contrôler comme ça

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

Il existe deux façons d'afficher l'extension Aujourd'hui:

  1. Mode compact (hauteur fixe pour Widget)
  2. Mode d'expansion (hauteur variable pour le widget)

Quel que soit le code que vous faites pour modifier la hauteur d'extension en mode Compact, cela ne fera aucune différence. Vous devez donc changer le mode du mode compact au mode Expand.

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

Vous pouvez référer WWDC pour plus de mises à jour sur les extensions d'application

8
fAiSaL

Widget d'aujourd'hui par défaut UIEdgeInsets defaultMarginInsets (UIEdgeInsets) defaultMarginInsets = (haut = 0, gauche = 44, bas = 39, droite = 0)

Vous devez ajouter cette méthode

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