Я заметил очень странное поведение в отношении автомакета в виджете «Сегодня», который я только что создал для своего приложения. Пытаясь добраться до корня проблемы, я создал простой новый проект Xcode (приложение с одним представлением) и добавил Today Extension в качестве новой цели, даже не касаясь Это.
Когда я запускаю расширение «Сегодня» на своем устройстве (iPhone 6s), первое, что происходит, это то, что в консоли возникают конфликты ограничений макета:
2016-05-03 18:17:22.216 TodayExtension[10183:4611907] Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want.
Try this:
(1) look at each constraint and try to figure out which you don't expect;
(2) find the code that added the unwanted constraint or constraints and fix it.
(
"<_UILayoutSupportConstraint:0x15c665320 V:[_UILayoutGuide:0x15c6657b0(0)]>",
"<_UILayoutSupportConstraint:0x15c663890 V:|-(0)-[_UILayoutGuide:0x15c6657b0] (Names: '|':UIView:0x15c6642a0 )>",
"<_UILayoutSupportConstraint:0x15c666010 V:[_UILayoutGuide:0x15c666380(0)]>",
"<_UILayoutSupportConstraint:0x15c666ed0 _UILayoutGuide:0x15c666380.bottom == UIView:0x15c6642a0.bottom>",
"<NSLayoutConstraint:0x15c666b80 V:[_UILayoutGuide:0x15c6657b0]-(NSSpace(8))-[UILabel:0x15c6617c0'Hello World']>",
"<NSLayoutConstraint:0x15c666bd0 V:[UILabel:0x15c6617c0'Hello World']-(NSSpace(8))-[_UILayoutGuide:0x15c666380]>",
"<NSLayoutConstraint:0x15c552820 'UIView-Encapsulated-Layout-Height' V:[UIView:0x15c6642a0(0)]>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x15c666bd0 V:[UILabel:0x15c6617c0'Hello World']-(NSSpace(8))-[_UILayoutGuide:0x15c666380]>
Вы заметите, что последним из ограничений в списке является UIView-Encapsulated-Layout-Height, который устанавливает высоту 0 в представлении. Я проверил и понял, что указанное представление является корневым представлением самого виджета. Так что по какой-то причине, которая находится за пределами моего понимания, система внутренне создает ограничение высоты 0 пикселей, которое конфликтует с настройкой представления в Interface Builder. (Как вы увидите, когда вы создадите новое сегодняшнее расширение в Xcode, там нет ничего, кроме UILabel, прикрепленного к каждой стороне корневого представления виджета.)
Обычно я бы сказал, что это огромная ошибка iOS, но, поскольку это по умолчанию шаблон Apple для создания виджетов Today, я просто не могу поверить, что он сломан. Есть идеи, что вызывает такое противоречивое поведение и как его исправить (правильно)?
Чего я в основном пытаюсь достичь с помощью щедрости...
... состоит в том, чтобы выяснить, существует ли надежный способ использовать автомакет в виджете Today без введения нескольких обходных путей и "грязных хаков" что вы не будете использовать в обычном приложении. (Если вы в конечном итоге добавите множество ограничений, создающих фиксированные фреймы и не позволяющих содержимому динамически увеличиваться, это не совсем идея Autolayout, не так ли?)
Тесно связанный вопрос, который является частью проблемы и может дать подсказку:
Непоследовательное поведение виджета Today нарушает ограничения высоты подпредставления
widgetMarginInsetsForProposedMarginInsets? - person Aadil Keshwani   schedule 02.06.2016