Подтвердить что ты не робот

Какова высота нового iOS 10 Today Widget/Extension?

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

4b9b3361

Ответ 1

В 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?

Ответ 2

Виджет в iOS 10 был изменен, как вы заметили, и теперь имеет фиксированную высоту. Также добавлены новые возможности для сегодняшнего расширения. Из них - NCWidgetDisplayMode. В основном у вас есть кнопка в правом углу, где вы можете "Показать больше" или "Показать меньше".

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

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

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

То, что вам нужно сделать, это в основном добавить следующий метод:

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

@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 еще не исправлена. Проверьте демонстрацию из Keyplus Apple, и вы заметите, что у него была проблема с этим.

Ответ 3

Просто выполните следующее:

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

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