Я добавляю элементы управления в форму SwiftUI, чтобы помочь пользователю вводить данные (и ограничивать ввод!). Хотя в Forms есть что нравится, я обнаружил, что вещи, которые прекрасно работают вне этого контейнера, делают внутри него очень неожиданные вещи, и не всегда очевидно, как это компенсировать.
План состоит в том, чтобы иметь поле данных отображается в виде одной строки. При нажатии на строку элемент управления выдвигается из-за поля данных - строку необходимо будет расширить (по высоте), чтобы разместить элемент управления.
Я использую Swift Playgrounds для разработки доказательства концепции (или неудача в моем случае). Идея состоит в том, чтобы использовать ZStack, который позволит создать красивую скользящую анимацию, перекрывая представления и задавая им другой zIndex и применяя смещение при касании представления поля данных. Звучит просто, но, конечно, строка формы не расширяется при расширении ZStack.
Регулировка рамки ZStack при расширении вызывает всевозможные странные изменения в отступах (или, по крайней мере, это похоже на это), которые можно компенсировать встречным смещением «верхнего» вида, но это вызывает другие непредсказуемые поведение. Указатели и идеи с благодарностью приняты.
import SwiftUI
struct MyView: View {
@State var isDisclosed = false
var body: some View {
Form {
Spacer()
VStack {
ZStack(alignment: .topLeading) {
Rectangle()
.fill(Color.red)
.frame(width: 100, height: 100)
.zIndex(1)
.onTapGesture { self.isDisclosed.toggle() }
Rectangle()
.fill(Color.blue)
.frame(width: 100, height: 100)
.offset(y: isDisclosed ? 50 : 0)
.animation(.easeOut)
}
}
Spacer()
}
}
}
Свернутая стопка
Развернутая стопка - просмотр перекрытий соседней строки
Результат при настройке вертикальной рамки ZStack в развернутом виде - верхнее заполнение увеличивается