Я имею создание 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
Как контролировать, как перемещается/изменен Swiftui, когда его содержание слишком велик? ⇐ IOS
Программируем под IOS
1757411250
Anonymous
Я имею создание kickyheaderscrollview , используя zstack для наложения myscrollview с помощью заголовка.
MyScrollView - это uiviewcontrollerRepresentable , удерживающее uiscrollview , которая позволяет установить ContentInset и предоставляет ContentOffset обновления на прокрутке. Содержание видно под заголовком. Когда вид прокрутки прокручивается, вид заголовка сжимается до тех пор, пока не будет достигнут Minheaderheight . В этот момент содержимое прокрутки начинает прокручивать под заголовком. Если это так, [b] Содержание заголовка следует подрезать [/b].
Как контролировать это? 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)
}
}
)
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79759728/how-to-control-how-a-swiftui-is-moved-resized-when-its-content-is-too-large[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия