Как контролировать, как перемещается/изменен Swiftui, когда его содержание слишком велик?IOS

Программируем под IOS
Ответить
Anonymous
 Как контролировать, как перемещается/изменен Swiftui, когда его содержание слишком велик?

Сообщение Anonymous »

Я имею создание kickyheaderscrollview , используя zstack для наложения myscrollview с помощью заголовка.
MyScrollView - это uiviewcontrollerRepresentable , удерживающее uiscrollview , которая позволяет установить ContentInset и предоставляет ContentOffset обновления на прокрутке. Содержание видно под заголовком. Когда вид прокрутки прокручивается, вид заголовка сжимается до тех пор, пока не будет достигнут Minheaderheight . В этот момент содержимое прокрутки начинает прокручивать под заголовком. Если это так, Содержание заголовка следует подрезать .
Как контролировать это? 200px и minheaderheight - 100px . Это работает нормально, пока содержание заголовка содержит только два партия 50 %. Но когда добавляется третий направление 50px, высота содержания 150px превышает Minheaderheight 100px .
Хотя я понимаю, почему это разбивает макет, я хотел бы знать, может ли я контролировать, как это обрабатывается (обрезка вместо движения). alt = "Введите описание изображения здесь" src = "https://i.sstatic.net/cwbvamrg.gif"/>
struct StickyHeaderScrollView: View {
let contentHeader: () -> Header
let contentBody: Body

private var minHeaderHeight: CGFloat
private var defaultHeaderHeight: CGFloat
@State private var headerHeight: CGFloat = 1

init(
headerHeight: CGFloat = 200,
minHeaderHeight: CGFloat = 50,
@ViewBuilder header: @escaping () -> Header,
@ViewBuilder body: () -> Body
) {
self.defaultHeaderHeight = headerHeight
self.minHeaderHeight = minHeaderHeight

self.contentHeader = header
self.contentBody = body()
}

var body: some View {
ZStack(alignment: .top) {
// MyScrollView is a UIViewControllerRepresentable holding an UIScrollView. Used
// instead of SwiftUI ScrollView be able to set the contentOffset and get
// scroll position updates
MyScrollView(
content: { contentBody },
topContentOffset: defaultHeaderHeight,
onScroll: { contentOffset in
self.headerHeight = max(minHeaderHeight, -contentOffset.y)
}
)
.onAppear {
headerHeight = defaultHeaderHeight
}
.ignoresSafeArea(edges: .bottom)

VStack(spacing: 0) {
contentHeader()
}
.frame(height: headerHeight)
}
}
}

struct SomeView: View {
var body: some View {
StickyHeaderScrollView(
headerHeight: 200,
minHeaderHeight: 100,
header: {
ZStack {
// Navbar
VStack {
HStack {
Button("Cancel") {}
Spacer()
Button("Save") {}
}
.padding(.top)
.padding(.bottom, 16)
.background(.green)
}
.frame(maxHeight: .infinity, alignment: .top)
.background(.yellow)

// Some Header Content
// Total height: 3 rect * 50 = 150 > minHeaderHeight: 100
VStack(spacing: 0) {
Rectangle().fill(.blue).frame(width: 50, height: 50)
Rectangle().fill(.purple).frame(width: 50, height: 50)
Rectangle().fill(.cyan).frame(width: 50, height: 50)
}
//.clipped() No effect
}
//.clipped() No effect + header background is no longer automatically extendet into safe area
.padding(.horizontal)
.background(.gray)
},
body: {
VStack {
// Some ScrollContent
Color.red.frame(height: 200)
Color.blue.frame(height: 200)
Color.green.frame(height: 200)
Color.purple.frame(height: 200)
Color.orange.frame(height: 200)
}
}
)
}
}


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

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

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

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

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

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