Проблема выравнивания виджета «Сегодня» в iOS 8

Вот моя раскадровка

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

Я использую автомакет и НЕ использую классы размеров.

Когда я запускал его на iPhone 5s, он работал нормально (как в портретной, так и в альбомной ориентации) введите здесь описание изображения

Но когда я запустил его на iPhone 6 plus (портрет), он не выравнивается должным образом. введите здесь описание изображения

на iPhone 6 plus (альбомная ориентация) хуже. введите здесь описание изображения

Я знаю, что могу использовать -widgetMarginInsetsForProposedMarginInsets: для установки поля, но в этом случае мне нужно будет настроить поле для каждого устройства. Это было бы ужасно :(

Итак, есть ли способ менее болезненно выровнять подвид с заголовком?


person Keoros    schedule 24.09.2014    source источник
comment
Вы используете автоматическую раскладку? Если это так, просто установите ограничение с маржей контейнера.   -  person Leo Natan    schedule 25.09.2014
comment
Но какая маржа, она разная на разных устройствах/ориентациях   -  person Keoros    schedule 25.09.2014
comment
Я думаю, что система устанавливает правильную маржу для каждого устройства   -  person Leo Natan    schedule 25.09.2014
comment
Я не перезаписывал метод widgetMarginInsetsForProposedMarginInsets. Поля различаются на каждом устройстве, как показано на снимках экрана выше. (Синяя область — это весь вид раскадровки)   -  person Keoros    schedule 25.09.2014
comment
мне пришлось использовать widgetMarginInsets (добавляя 11 к левому полю на iPad), чтобы выровнять мой текст с текстом TestToday в вашем примере. это также было непоследовательным на всех устройствах (даже ориентациях). это также зависит от того, использую ли я симулятор или реальное устройство. очень расстраивает!   -  person Joris Weimar    schedule 25.09.2014


Ответы (4)


Похоже, вы должны установить его вручную. Вы можете сделать это, создав ограничение, затем указав для него IBOutlet и установив константу в зависимости от устройства/ориентации.

Для справки, вот поля, которые я нашел вам нужными:

  • 5S - 1 (2px)
  • 6 - 1 (2px)
  • 6 плюс портрет - 5 (15px)
  • 6 плюс пейзаж - 34 (102px)

Вы можете определить, какой из них вам нужен, по размеру расширенного вида, который составляет 414 pt для портретного iPhone 6.

person Simon Fry    schedule 07.10.2014
comment
как насчет альбомной и портретной ориентации iPad? - person Erich; 16.10.2014

Установка краевых вставок на ноль должна решить проблему:

- (UIEdgeInsets)widgetMarginInsetsForProposedMarginInsets:(UIEdgeInsets)defaultMarginInsets
{
    return UIEdgeInsetsZero;
}
person Stephen    schedule 28.09.2014
comment
На iOS 9 полностью убирает вставки и выглядит еще хуже. - person Maciej Swic; 30.07.2015
comment
Спасибо~ Это очень помогло. Отлично работает на iOS 9.1 - person Kaiyuan Xu; 01.12.2015

Вам необходимо настроить поля виджета:

- (UIEdgeInsets)widgetMarginInsetsForProposedMarginInsets:(UIEdgeInsets)defaultMarginInsets;

Документация: https://developer.apple.com/library/ios/documentation/NotificationCenter/Reference/NCWidgetProviding_Protocol/index.html

person Zac Altman    schedule 24.09.2014
comment
Значит, мне нужно отдельно настроить 8 значений? (iphone 5, iphone 6, iphone 6+, ipad, обе ориентации) - person Keoros; 25.09.2014

Исправления для некоторых устройств. Требуется Эрикас UIDevice-Extension.

- (UIEdgeInsets)widgetMarginInsetsForProposedMarginInsets:(UIEdgeInsets)defaultMarginInsets
{
    defaultMarginInsets.bottom = 0;

    if ([UIDevice.currentDevice.modelIdentifier containsString:@"iPhone7,1"] && self.traitCollection.horizontalSizeClass == UIUserInterfaceSizeClassCompact) {
        defaultMarginInsets.left += 5;
    } else if ([UIDevice.currentDevice.modelIdentifier containsString:@"iPhone7,1"] && self.traitCollection.horizontalSizeClass == UIUserInterfaceSizeClassRegular) {
        defaultMarginInsets.left += 34;
    } else {
        defaultMarginInsets.left += 1;
    }

    return defaultMarginInsets;
}
person Maciej Swic    schedule 30.07.2015