Как установить высоту расширения Widget Today?

Как я могу изменить высоту своего расширения App Today в Центре уведомлений?

Я попробовал его с помощью Interface Builder и с кодом, Interface Builder Отображает представление с высотой 600, но не применяет эту высоту на устройстве.

Кажется, я не могу получить больше 80 пикселей...

enter image description here

Ответ 1

В вашем виджете UIViewController.m (Objective-C):

self.preferredContentSize = CGSizeMake(0, 200);

У вашего виджета будет высота 200.

Обратите внимание, что ширина не будет влиять на представление, так как виджеты должны соответствовать точной ширине центра уведомлений, который обрабатывается автоматически.

Кроме того, если вы хотите анимировать изменения высоты вашего представления, вы можете реализовать (Objective-C):

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

в вашем контроллере просмотра, используя animateAlongsideTransition:completion:

Ответ был немного скрыт; вам пришлось щелкнуть на боковой панели документации, чтобы в итоге найти этот фантастический документ.


Другой способ заключается в использовании ограничений автомакета, чтобы ограничить высоту вашего представления.

Ответ 2

Виджеты имеют свои высоты, скорректированные системой. Если вы определили свою высоту с помощью ограничений, это будет автоматически изменено по мере необходимости. Если вы используете явный макет, вы можете запросить новую высоту, изменив preferredContentSize вашего виджета.

Обратите внимание, что у вас нет центра гарантийного уведомления, который будет уважать ваш запрос высоты: он может быть скорректирован автоматически, он может быть скорректирован, но не на нужную высоту, которую вы хотите, или вообще не может быть удостоен.

Лучший способ разработки виджета - использовать ограничения автоматического макета для установки значений высоты, таким образом ваш виджет будет легко адаптироваться к разным высотам.

Ответ 3

Так как высота расширения 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;
    }
}

Также вам может потребоваться вызвать setWidgetLargestAvailableDisplayMode: в вашем контексте расширения в сегодняшнем виде контроллера viewDidLoad метода вроде этого (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/48930

Ответ 4

Лучший способ - это, конечно, Autolayout, но по умолчанию есть поля, которые вы можете контролировать таким образом

func widgetMarginInsetsForProposedMarginInsets
    (defaultMarginInsets: UIEdgeInsets) -> (UIEdgeInsets) {
    return UIEdgeInsetsZero
}

Ответ 5

Существует два способа отображения Today:

  • Компактный режим (фиксированная высота для виджета)
  • Режим разворота (высота переменной для виджета)

Независимо от того, какой код вы делаете, чтобы изменить высоту расширения в режиме Compact, не будет иметь никакого значения. Поэтому вам нужно изменить режим от компактного до режима разворота.

// 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 для получения дополнительных обновлений о расширениях приложений

Ответ 6

Сегодня виджет по умолчанию UIEdgeInsets defaultMarginInsets (UIEdgeInsets) defaultMarginInsets = (top = 0, left = 44, bottom = 39, right = 0)

Вы должны добавить этот метод

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