Расширение My Today должно иметь динамическую высоту в зависимости от содержимого, отображаемого виджетом. Мне удалось добиться этого, добавив ограничение для самого нижнего элемента: верхняя часть нижнего руководства по макету меньше или равна низу самого нижнего элемента с константой 0, приоритетом 999, множителем 1.
Это работает точно так, как ожидалось на iPhone - высота виджета соответствует всему содержимому, плюс нижнее поле по умолчанию применяется перед показом следующего виджета.
Но на iPad кажется, что высота моего виджета устанавливается равной максимальной высоте. Центр уведомлений позволяет виджету быть - под моим виджетом много места, он почти полноэкранный.
Как удалить лишнее пространство?
Я точно знаю, в чем проблема, но не знаю, как ее решить - см. Раздел «Проблема». Сначала позвольте мне объяснить настройку:
Настройка:
Я установил представление этого расширения в раскадровке, программно ничего не делается. Вид состоит из 5 элементов, расположенных вертикально, и некоторых других горизонтально. Это ограничения автоматического макета для этой вертикальной линии сверху вниз - где не заявленный приоритет равен 1000, множитель 1:
UILabel: height = 35, top space to top layout guide with constant of 10
UIButton: equal height and width to a different button (whose aspect ratio is 1:1, there is no fixed width/height), top space to label 10
UIButton: equal height and width to same button, top space to above button 8
UIButton: equal height and width to same button, top space to above button 8
UIButton: equal height and width to same button, top space to above button 8, bottom space to bottom layout guide <= 0 with priority 999
Необходимое поведение:
- Мне нужна сетка из кнопок 4x4, расположенная под одной полноразмерной этикеткой.
- Каждая кнопка должна быть одинаковой ширины и высоты - все в квадрате.
- Нет лишнего места под последним рядом кнопок
Результат:
Ожидаемый результат:
Проблема:
Ограничения соотношения сторон для всех кнопок в конечном итоге косвенно накладывают «неявное» ограничение соотношения сторон на высоту представления виджета, когда оно отправляется systemLayoutSizeFittingSize:withHorizontalFittingPriority:verticalFittingPriority:
, где оно передается необходимая ширина (724) для макета с требуемым приоритетом и высота 0 (для сжатия вида) с приоритетом уровня подгонки. Это приводит к тому, что на iPad вид виджетов становится высоким, причем вид из них изначально шире. Но нет фактического ограничения соотношения сторон, которое можно было бы удалить. По сути, поскольку я применил ограничения соотношения сторон ко всей кнопке, высота сегодняшнего расширения зависит от его ширины (с учетом всех ограничений вместе, соотношения сторон и прочего). Таким образом, высота надставки неуместна в широкой области, что проявляется на таком широком устройстве, как iPad. Ограничения на кнопки нужно пересмотреть или как-то скорректировать.
Образец проекта:
образец проекта , демонстрирующий выпуск доступен в CloudApp, так что вы можете скачать его и поиграть с ним.
Что я пробовал:
Я попытался удалить вставки полей по умолчанию, переопределив widgetMarginInsetsForProposedMarginInsets
и вернув 0
для нижней части. Это удалило отступы по умолчанию, поэтому немного уменьшило высоту, но под ним все еще есть много дополнительного места.
У UILabel
было ограничение: ведущий интервал метки равен ведущему интервалу супервизора - константа 0, приоритет 1000, множитель 1. Если я просто изменю его на ведущее поле супервизора, лишний нижний интервал волшебным образом исчезнет. Мне было интересно, было ли это из-за того, что элементы становились слишком большими, поэтому увеличение количества левого интервала уменьшило бы их размер, но я попытался оставить его на обычном интерлиньяже и увеличить константу, и это не решило проблему. Но это решает проблему только для iPad в портретной ориентации. И он даже не решает его полностью, каждый раз, когда вы опускаете Центр уведомлений, он начинается с большой высоты, а затем сжимается до нужного размера. В альбомной ориентации он никогда не сжимается до нужного размера.
Попытки решения:
- @Lefter предлагает жесткое кодирование размера, которое в этом случае не сработает, поскольку высота является динамической, а виджет доступен для многих размеров / ориентаций экрана.
- @Yuyutsu попытался решить эту проблему, но, к сожалению, он не соответствует требованиям и демонстрирует противоречивые ограничения и измененный макет.