Как я могу привязать изменяемые размеры представлений в виде прокрутки к верхней ведущей точке, чтобы при их увеличении они росли вниз?
Контекст: я пытаюсь создать прокрутки для представлений, размеры которых можно изменитьпо высоте, перетаскивая ручку внизу вверх и вниз. Моя проблема в том, что когда он изменяет размеры, он изменяет размеры как вверх, так и вниз. Я хочу, чтобы вершина оставалась на месте и корректировала только, насколько далеко она идет.
Я не думаю, что проблема заключается в просмотре прокрутки, поскольку поведение будет таким же, если я заменю его на VStack. Однако в контексте просмотра прокрутки его изменение в сторону увеличения делает пользователя неспособным прокрутить вверх достаточно далеко, чтобы увидеть верхнюю часть представления.
Полный пример кода следует под скриншотами. Проблема возникает как на iPad, так и на симуляторе iPhone
. Первый снимок экрана показывает начальное состояние до изменения размера самого верхнего элемента

Второй снимок экрана показывает состояние после изменения размера самого верхнего элемента - самого верхнего элемента сейчасвыходит за пределы списка, поэтому мы не можем видеть прокрутку вверх, чтобы увидеть верхнюю часть

Здесь следует полный код, запускаемый с Xcode 11.0, чтобы показать проблему
struct ScaleItem: View {
static let defaultHeight: CGFloat = 240.0
@State var heightDiff: CGFloat = 0.0
@State var currentHeight: CGFloat = ScaleItem.defaultHeight
var resizingButton: some View {
VStack {
VStack {
Spacer(minLength: 15)
HStack {
Spacer()
Image(systemName: "arrow.up.and.down.square")
.background(Color.white)
Spacer()
}
}
Spacer()
.frame(height: 11)
}
.background(Color.clear)
}
var body: some View {
ZStack {
VStack {
Spacer()
HStack {
Spacer()
Text("Sample")
Spacer()
}
Spacer()
}
.background(Color.red)
.overlay(
RoundedRectangle(cornerRadius: 5.0)
.strokeBorder(Color.black, lineWidth: 1.0)
.shadow(radius: 3.0)
)
.padding()
.frame(
minHeight: self.currentHeight + heightDiff,
idealHeight: self.currentHeight + heightDiff,
maxHeight: self.currentHeight + heightDiff,
alignment: .top
)
resizingButton
.gesture(
DragGesture()
.onChanged({ gesture in
print("Changed")
let location = gesture.location
let startLocation = gesture.startLocation
let deltaY = location.y - startLocation.y
self.heightDiff = deltaY
print(deltaY)
})
.onEnded { gesture in
print("Ended")
let location = gesture.location
let startLocation = gesture.startLocation
let deltaY = location.y - startLocation.y
self.currentHeight = max(ScaleItem.defaultHeight, self.currentHeight + deltaY)
self.heightDiff = 0
print(deltaY)
print(String(describing: gesture))
})
}
}
}
struct ScaleDemoView: View {
var body: some View {
ScrollView {
ForEach(0..<3) { _ in
ScaleItem()
}
}
}
}