Какова высота нового виджета/расширения iOS 10 Today?

Я создаю виджет iOS Today, и во время тестирования iOS 10 я заметил, что все виджеты теперь имеют одинаковую высоту (предыдущие версии позволяли разработчику устанавливать высоту). Какова идеальная высота/как лучше всего справиться с этим новым ограничением? У меня Swift, и я не использовал autolayout, к вашему сведению. Заранее спасибо!


person user3658503    schedule 30.06.2016    source источник


Ответы (3)


В iOS 10 по умолчанию высота виджета «Сегодня» фиксирована. Кроме того, минимальная высота свернутого виджета ограничена.

Свернутый виджет имеет высоту примерно две с половиной строки таблицы. Развернутый виджет в идеале не должен быть выше высоты экрана.

Эти примечания взяты из Руководств по пользовательскому интерфейсу iOS.

Мы можем сделать следующее, чтобы изменить его.

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

Быстрая версия:

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

Версия ObjC:

self.extensionContext.widgetLargestAvailableDisplayMode = NCWidgetDisplayModeExpanded;

А затем реализуйте метод протокола, например:

Быстрая версия:

@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
    }
}

Версия 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;
    }
}

Запустите свою цель, вы увидите кнопку «Показать больше» в правом углу вашего виджета. Коснитесь его, и вы увидите изменение.

Подробнее: Как изменить размер виджета в iOS 10?

person yys    schedule 29.07.2016
comment
Спасибо за полную инструкцию! - person Mona; 08.02.2017

Как вы заметили, виджет в iOS 10 изменился и теперь имеет фиксированную высоту. В расширение Today также были добавлены новые функции. На одном из них находится NCWidgetDisplayMode. По сути, у вас есть кнопка в правом углу, где вы можете «Показать больше» или «Показать меньше».

Начните с добавления следующего в ваш viewDidLoad()

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

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

Затем вам нужно добавить следующий метод:

Версия для 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
    }

}

Версия 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;
    }
}

Обратите внимание на два момента:

Xcode автоматически предложит вам добавить доступную проверку для версии iOS (по крайней мере, для Swift). Поэтому не удаляйте старый способ сделать это self.preferredContentSize = CGSizeMake... Это все еще необходимо для более старых версий iOS.

В widgetActiveDisplayModeDidChangeфункция activeDisplayMode == NCWidgetDisplayMode.Compactбудет вызываться при переходе от "Показать больше" > "Показать меньше". Это потому, что он запускается сразу из системы iOS. И activeDisplayMode == NCWidgetDisplayMode.Expanded будет вызываться, когда вы переходите от "Показать меньше" > "Показать больше".

И последнее, это все еще немного глючит с кнопками «Показать больше» и «Показать меньше», и это еще не исправлено Apple. Посмотрите демонстрацию из Apples Keynote, и вы заметите, что он была проблема с ошибкой с этим.

person Rashwan L    schedule 18.09.2016
comment
???? палец вверх за обнаружение ошибки Apple, что также демонстрирует, как они мастерски выкручиваются из ситуации. :) - person Almas Adilbek; 21.10.2016

Просто сделайте следующее:

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

вы можете использовать оба типа: .compact и .expanded.

person Bartłomiej Semańczyk    schedule 28.04.2017
comment
Это действительно крутой способ. Я много ищу и пытаюсь получить правильный размер в обратном вызове на всю жизнь, таком как viewDidAppear и viewWillTransition. Но эти способы не идеальны. Потому что установка правильного кадра в обратных вызовах приводит к тому, что виджет выглядит обновленным и перерисовывается, что неприятно. Спасибо. Я могу использовать это, чтобы установить правильный кадр в viewDidLoad. - person Victor Choy; 06.07.2017