Расширение My Today должно иметь динамическую высоту, основанную на содержимом, отображаемом виджетами. Я смог добиться этого, добавив ограничение на мой самый нижний элемент: нижний макет руководства сверху меньше или равен нижней нижней части элемента, с константой 0, приоритетом 999, множителем 1.
Это работает точно так, как ожидалось на iPhone. Высота виджета соответствует всему содержимому плюс нижнее поле по умолчанию применяется до отображения следующего виджета.
Но на iPad кажется, что мой размер виджета, равный максимальной высоте, Notification Center позволит виджету быть - там много места под моим виджетами, это почти полный экран.
Как удалить лишнее пространство?
Я точно знаю, в чем проблема, но я не уверен, как ее решить - см. раздел "Проблема". Сначала позвольте мне объяснить настройку:
Настройка:
Я установил это расширение в раскадровку, ничего не делается программно. Представление состоит из 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. Ограничения на кнопки должны быть пересмотрены или как-то отрегулированы.
Пример проекта:
A образец проекта, который демонстрирует проблему, доступен из CloudApp, чтобы вы могли скачать и играть с ним.
Что я пробовал:
Я попытался удалить вкладки по умолчанию по умолчанию, переопределив widgetMarginInsetsForProposedMarginInsets
и вернув 0
для нижней. Это удалило заполнение по умолчанию, поэтому немного уменьшило высоту, но под ним все еще много свободного места.
UILabel
имел ограничение на это: метка, ведущая, равная supview, ведущая - постоянная 0, приоритет 1000, множитель 1. Если я просто изменил это на верхний margin, верхнее дно расстояние магически исчезает. Я задавался вопросом, было ли это потому, что элементы становились слишком большими, поэтому увеличение количества левого интервала уменьшало бы их размер, но я старался, чтобы он был установлен на регулярное лидерство и увеличивал константу, и это не помогло решить проблему. Но это только разрешает проблему для iPad в портрете. И это даже не полностью разрешает его, каждый раз, когда вы вытаскиваете Центр уведомлений, он начинается с большой высоты, а затем сжимается до нужного размера. В ландшафте он никогда не сокращается до нужного размера.
Попытка решения:
- @Lefteris предлагает жестко кодировать размер, который не будет работать в этом случае поскольку высота динамическая, а виджет доступен для многих экранов размеры/ориентации.
- @Yuyutsu попытался его решить, но, к сожалению, он не отвечает требованиям и демонстрирует противоречивые ограничения и измененный макет.