Как установить высоту расширения виджета «Сегодня»?

Как я могу изменить высоту расширения «Сегодня» моего приложения в Центре уведомлений?

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

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

введите здесь описание изображения


person Gotschi    schedule 04.06.2014    source источник


Ответы (6)


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

self.preferredContentSize = CGSizeMake(0, 200);

Ваш виджет будет иметь высоту 200.

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

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

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

в контроллере представления с помощью -animateAlongsideTransition:completion:

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


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

person Andrew    schedule 04.06.2014
comment
Это не рекомендуемый метод. Как было сказано в сессиях, вы должны использовать автоматическую компоновку. - person Isaiah Turner; 04.06.2014
comment
@IsaiahTurner Спасибо. У меня еще не было возможности посмотреть вчерашние сеансы онлайн... - person Andrew; 04.06.2014
comment
предпочитаемыйContentSize не работает в ландшафтном режиме. Похоже, для виджета не хватает места. @SantaClaus Не могли бы вы поделиться кодом настройки высоты с автоматическим макетом? - person Vince Yuan; 16.09.2014

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

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

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

person lxt    schedule 04.06.2014
comment
+1 за объяснение и спасибо за ответ! но авто-макет, к сожалению, у меня в этой ситуации не сработал :/ - person Gotschi; 04.06.2014
comment
Если у вас возникли проблемы с автоматическим макетом, не обновляющим высоту вашего расширения, я бы попробовал 1) визуализировать ограничения с помощью новых инструментов отладки в Xcode (чтобы убедиться, что ваши ограничения делают то, что вы думаете), и если все выглядит нормально, 2) регистрация ошибки, потому что она должна «просто работать». - person lxt; 04.06.2014
comment
Это очень полезный ответ. Это объясняет, почему мои виджеты не всегда так информативны, как я ожидаю. Но где ты это вычитал? Я прочитал всю документацию по расширениям Today и не помню, чтобы система могла решить, должна ли она быть большой или нет. - person Andy Ibanez; 07.06.2014
comment
Он находится в файлах заголовков для платформы Центра уведомлений. - person lxt; 07.06.2014
comment
Как вы устанавливаете ограничение по высоте в IB для автомакета? У меня есть сегодня VC и это вид, но я не могу установить ограничение по высоте для представления. Представление имеет два подпредставления, и я установил эти ограничения... - person i_am_jorf; 14.08.2014
comment
Я не уверен. Лучший способ разработать виджет — использовать ограничения автоматического макета для установки значений высоты, чтобы ваш виджет легко адаптировался к разным высотам. действует во всех контекстах. Как бы вы использовали autolayout для указания высоты, если вы загружаете данные по сети, а затем высота будет вычисляться динамически? - person Awesome-o; 11.09.2014
comment
@Awesome-o: потому что автоматическая компоновка может обеспечивать динамическое изменение размера в соответствии с содержимым представления. - person lxt; 12.09.2014
comment
@jeffamaphone, добавляя ограничения к подпредставлениям, будет определять высоту, а также то, что iOS решит разрешить. Например, попробуйте добавить UILabel с нулевым верхним и нижним полями и заданной высотой в основной вид. Что я обнаружил на практике, так это то, что я могу получить высоту, равную примерно одному экрану контента. Этот тип воняет для ландшафтного режима на iPhone, где я могу получить высоту только около 160 точек. - person Matt R; 12.09.2014
comment
Да, у меня были некоторые проблемы с этим; продолжал выходить на нулевой высоте. Потом дизайнеры все поменяли, а я все переделал и теперь вроде нормально. - person i_am_jorf; 13.09.2014

Поскольку высота расширения 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.

person Lion    schedule 29.10.2016
comment
Имейте в виду, что размеры виджета (компактный/расширенный) на iPad отличаются. Не могу сейчас вспомнить точные значения, но они больше, чем размер виджета iPhone. - person DPR; 09.12.2016
comment
Вам также необходимо установить extensionContext?.widgetLargestAvailableDisplayMode = .expanded, чтобы получить расширенный режим. - person Enrico Susatyo; 12.01.2017
comment
Итак, как мы должны его настроить, если мы хотим поддерживать как более ранние, так и более ранние версии iOS10? - person GeneCode; 21.01.2017
comment
@Lion, у меня это работает. Но я также хочу прокручивать свой виджет, так как я использую tableview для отображения своего контента, и у меня есть список данных для отображения в виджете. Не могли бы вы помочь мне, если у вас есть идеи? - person Anjali jariwala; 21.11.2018

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

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

Существует два способа отображения расширения «Сегодня»:

  1. Компактный режим (фиксированная высота виджета)
  2. Режим расширения (переменная высота для виджета)

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

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

person fAiSaL    schedule 14.11.2016
comment
widgetActiveDisplayModeDidChange только для iOS 10 и выше. - person emotality; 21.11.2016

Виджет Today по умолчанию UIEdgeInsets defaultMarginInsets (UIEdgeInsets) defaultMarginInsets = (сверху = 0, слева = 44, снизу = 39, справа = 0)

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

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