Как изменить вертикальное выравнивание отдельных элементов в SwiftUI HStack?IOS

Программируем под IOS
Ответить
Anonymous
 Как изменить вертикальное выравнивание отдельных элементов в SwiftUI HStack?

Сообщение Anonymous »

У меня есть следующий код.

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

struct ContentView: View {
@State var textInput: String = "Testing"

private let inputCornerRadius: CGFloat = 24

var body: some View {
HStack(alignment: .bottom, spacing: 8) {
TextField("Chat", text: $textInput, axis: .vertical)
.lineLimit(1...9)
.textFieldStyle(.plain)

Button(action: send) {
Image(systemName: "paperplane.fill")
.foregroundStyle(.background)
.imageScale(.medium)
.padding(10)
.background(
Circle()
.fill(Color(.label))
)
}
}
.padding(.vertical, 8)
.padding(.leading, 10)
.padding(.trailing, 6)
.background(
RoundedRectangle(cornerRadius: inputCornerRadius, style: .continuous)
.fill(Color(.secondarySystemBackground))
)
.clipShape(RoundedRectangle(cornerRadius: inputCornerRadius, style: .continuous))
.padding(.horizontal, 10)
}

private func send() {}
}
Изображение
Проблема в том, что текстовое поле выровнено по нижнему краю. Я хочу, чтобы оно было по центру. Но вот в чем сложная часть: я хочу, чтобы кнопка отправки всегда была выровнена по низу (или по центру, если это всего лишь одна строка).
Если я изменю выравнивание HStack на .center, оно будет работать именно так, как я хочу для однострочного текста, но как только он станет несколькими строками, кнопка отправки будет центрирована, а не выровнена по низу.
Изображение

Итак, вот мои требования:
  • Для однострочного текста и кнопка ввода текста, и кнопка отправки центрируются по вертикали.
  • Для многострочного текста кнопка отправки выравнивается по нижней части серого фона (плюс отступы).
Что я пробовал:
  • Установить выравнивание по .center (выше я объяснил, почему это не работает)
  • Обернуть TextField в другой HStack, выровненный по центру (родительский элемент по-прежнему выровнен по нижнему краю). Это не дало никакого эффекта.
  • Добавлен VStack вокруг TextField с разделителями вверху и внизу. В результате вся высота представления растянулась в соответствии с высотой родительского представления (чего мне не нужна).
  • Добавлен .alignmentGuide(.bottom) { d in d[.bottom] к кнопке и установлено выравнивание на .center. Эффекта по-прежнему не было, и кнопка оставалась в центре.
В идеале я бы хотел избежать вычислений высоты текста и всего такого. Похоже, что это должен быть довольно простой пользовательский интерфейс, который я пытаюсь создать, поэтому нереально его усложнять.
Как я могу заставить кнопку всегда выравниваться по нижнему краю, в то время как TextField остается по центру?

Подробнее здесь: https://stackoverflow.com/questions/799 ... tui-hstack
Ответить

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

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

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

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

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