Я создаю виджет iOS Today, и во время тестирования iOS 10 я заметил, что все виджеты теперь имеют одинаковую высоту (предыдущие версии позволяли разработчику устанавливать высоту). Какова идеальная высота/как лучше всего справиться с этим новым ограничением? У меня Swift, и я не использовал autolayout, к вашему сведению. Заранее спасибо!
Какова высота нового виджета/расширения iOS 10 Today?
Ответы (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?
Как вы заметили, виджет в 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, и вы заметите, что он была проблема с ошибкой с этим.
Просто сделайте следующее:
let height = extensionContext?.widgetMaximumSize(for: .compact).height
вы можете использовать оба типа: .compact
и .expanded
.