Как заставить кнопки виджета SwiftUI заполнять высоту контейнера при использовании GeometryReader с рассчитанной высотойIOS

Программируем под IOS
Ответить
Anonymous
 Как заставить кнопки виджета SwiftUI заполнять высоту контейнера при использовании GeometryReader с рассчитанной высотой

Сообщение Anonymous »

Я создаю виджет iOS (WidgetKit) с сеткой кнопок 2×2, используя GeometryReader для расчета высоты строк. Кнопки должны полностью заполнять свои
контейнеры и иметь одинаковую высоту, как виджет Apple Shortcuts.
Ожидаемый результат:
Все кнопки должны иметь одинаковую высоту и равномерно заполнять доступное пространство, например:
Изображение

Фактический результат:
Фоны кнопок не заполняют расчетную высоту контейнера. Сами контейнеры равны (проверено по границам отладки
, показаны высотой 44 pt), но содержимое/фон кнопки не дотягивает:

Текущий Реализация:
Использование GeometryReader для вычисления cellHeight, а затем применение его с помощью .frame(height: cellHeight):

Код: Выделить всё

GeometryReader { geo in
let cellHeight = (geo.size.height - totalSpacing - totalPadding) / 2

VStack(spacing: 8) {
ForEach(0..
Button(intent: ExecuteWidgetActionIntent(...)) {
VStack(alignment: .leading, spacing: 8) {
Image(systemName: action.iconName)
Spacer(minLength: 0)
Text(action.displayName)
}
.padding(12)
.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .leading)
.background(Color.blue)
.clipShape(RoundedRectangle(cornerRadius: 14))
}
.buttonStyle(.plain)
< /code>
Границы отладки доказывают, что контейнеры имеют одинаковую высоту, но фоновые кнопки цветных кнопок не расширяются, чтобы заполнить их. Как я могу сделать фон кнопки
заполнить полную вычисленную высоту в Widgetkit? Каждая кнопка в стержне 
[*] Ожидается: ряды будут распределять высоту одинаково
[*] Результат: верхняя строка все еще выше, чем нижняя ряд


[*]  [b] grid с .gridcellUnsizedaxes ( /> [list]
 Добавлено .gridcellunsizedaxes (.vertical) < /code> к сетку < /li>
 Ожидается: GRID игнорирует внутренний размер содержания и распределять < /li>
 Результат: без изменений, строки все еще неравны < /li>

. />GeometryReader with VStack/HStack and calculated heights:[/b]

Calculated exact cellHeight
using available space
[*]Applied .frame(height: cellHeight) to each button container
[*]Expected: Buttons would fill the fixed Контейнеры высоты < /li>
Результат: Высоты контейнеров верны (подтверждаются отладчиками в 44PT), но фон кнопок не расширяется, чтобы заполнить их < /li>
< /ul>
< /li>

Код: Выделить всё

.frame(maxHeight: .infinity)
внутри метки кнопки:[/b]

Применено maxHeight к VStack внутри закрытия метки кнопки.
[*]Ожидается: содержимое кнопки расширится, чтобы заполнить доступное пространство.
[*]Результат: метка кнопки по-прежнему не заполняет высоту контейнера.
[/list]

[*]ZStack с фоном вне кнопки:
  • Обернутая кнопка в ZStack с цветным фоном
  • Ожидается: фон заполнит контейнер независимо
  • Результат: фон также не заполняет расчетную высоту

Основная проблема: В WidgetKit содержимое кнопки имеет собственный внутренний размер, который не соответствует
фиксированной высоте родительского контейнера, хотя границы отладки подтверждают, что контейнеры равны.

Подробнее здесь: https://stackoverflow.com/questions/797 ... ing-geomet
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»