В моем мнении Swiftui я пытаюсь создать складной резюме «сводного» нижнего листа. Чтобы воспроизвести повторную ошибку листов, я добавил перетаскиваемую капсулу и обновил высоту кадра представления на основе перевода. Пока это технически «работает», это безумно нервное и глюко. < /P>
var maxExpandedHeight: CGFloat
@State private var isDragging = false
@State private var isCollapsed = false
@State private var currentHeight: CGFloat = 0
init(transaction: Transaction, maxExpandedHeight: CGFloat = 250) {
self.transaction = transaction
self.maxExpandedHeight = maxExpandedHeight
}
var body: some View {
VStack(spacing: 12) {
// Top grabber handle
Capsule()
.fill(Color.secondary.opacity(isDragging ? 1.0 : 0.4))
.frame(width: 36, height: 5)
.padding(.top, 6)
.accessibilityLabel("Toggle summary details")
.accessibilityAddTraits(.isButton)
.contentShape(.rect)
.onTapGesture {
withAnimation(.spring(response: 0.25, dampingFraction: 0.9)) {
isCollapsed.toggle()
currentHeight = isCollapsed ? 0 : maxExpandedHeight
}
}
.gesture(
DragGesture(minimumDistance: 5)
.onChanged { value in
isDragging = true
// Base value depending on current state
let base = isCollapsed ? 0 : maxExpandedHeight
let proposed = base - value.translation.height
// Clamp to valid range
let clamped = min(max(proposed, 0), maxExpandedHeight)
// Only update if it meaningfully changed to prevent jank
if abs(clamped - currentHeight) > 10 {
withTransaction(SwiftUI.Transaction(animation: .none)) {
currentHeight = clamped
}
}
}
.onEnded { _ in
let shouldCollapse = currentHeight < maxExpandedHeight * 0.5
withAnimation(.spring(response: 0.25, dampingFraction: 0.9)) {
isCollapsed = shouldCollapse
currentHeight = shouldCollapse ? 0 : maxExpandedHeight
isDragging = false
}
}
)
VStack(spacing: 10) {
headerRow
summaryRow(title: "Subtotal", value: transaction.subtotal)
.font(.subheadline)
.foregroundStyle(.secondary)
ScrollView(.vertical) {
VStack {
ForEach(transaction.modifications) { mod in
modificationCard(mod)
.onSwipeToDelete {
deleteMod(mod)
}
.scrollTargetLayout()
}
}
}
.contentMargins(.trailing, 10, for: .scrollContent)
.scrollTargetBehavior(.paging)
.frame(maxHeight: maxExpandedHeight)
Divider().padding(.vertical, 4)
}
.frame(height: currentHeight, alignment: .top)
.animation(.snappy, value: currentHeight)
.clipped()
summaryRow(title: "Total", value: transaction.total())
.font(.title2.bold())
}
.padding()
.background(.ultraThinMaterial)
.clipShape(RoundedRectangle(cornerRadius: 24, style: .continuous))
.overlay(
RoundedRectangle(cornerRadius: 24)
.strokeBorder(.white.opacity(0.1), lineWidth: 1)
)
.shadow(color: .black.opacity(0.1), radius: 10, x: 0, y: 5)
.padding(.horizontal)
.onAppear {
currentHeight = isCollapsed ? 0 : maxExpandedHeight
}
.animation(.spring(response: 0.25, dampingFraction: 0.9, blendDuration: 0.2), value: isCollapsed)
.allowsHitTesting(true)
}
< /code>
Я попытался добавить анимацию, чтобы попытаться сгладить движение, добавить задержки между обновлением перевода перетаскивания, добавив проверку на небольшие изменения в переводе и т. Д., Но, кажется, ничего не работает. Любая помощь будет оценена!
Подробнее здесь: https://stackoverflow.com/questions/797 ... -jittering
Изменение размера каркаса с Draggesture вызывает джайтер ⇐ IOS
Программируем под IOS
-
Anonymous
1759873023
Anonymous
В моем мнении Swiftui я пытаюсь создать складной резюме «сводного» нижнего листа. Чтобы воспроизвести повторную ошибку листов, я добавил перетаскиваемую капсулу и обновил высоту кадра представления на основе перевода. Пока это технически «работает», это безумно нервное и глюко. < /P>
var maxExpandedHeight: CGFloat
@State private var isDragging = false
@State private var isCollapsed = false
@State private var currentHeight: CGFloat = 0
init(transaction: Transaction, maxExpandedHeight: CGFloat = 250) {
self.transaction = transaction
self.maxExpandedHeight = maxExpandedHeight
}
var body: some View {
VStack(spacing: 12) {
// Top grabber handle
Capsule()
.fill(Color.secondary.opacity(isDragging ? 1.0 : 0.4))
.frame(width: 36, height: 5)
.padding(.top, 6)
.accessibilityLabel("Toggle summary details")
.accessibilityAddTraits(.isButton)
.contentShape(.rect)
.onTapGesture {
withAnimation(.spring(response: 0.25, dampingFraction: 0.9)) {
isCollapsed.toggle()
currentHeight = isCollapsed ? 0 : maxExpandedHeight
}
}
.gesture(
DragGesture(minimumDistance: 5)
.onChanged { value in
isDragging = true
// Base value depending on current state
let base = isCollapsed ? 0 : maxExpandedHeight
let proposed = base - value.translation.height
// Clamp to valid range
let clamped = min(max(proposed, 0), maxExpandedHeight)
// Only update if it meaningfully changed to prevent jank
if abs(clamped - currentHeight) > 10 {
withTransaction(SwiftUI.Transaction(animation: .none)) {
currentHeight = clamped
}
}
}
.onEnded { _ in
let shouldCollapse = currentHeight < maxExpandedHeight * 0.5
withAnimation(.spring(response: 0.25, dampingFraction: 0.9)) {
isCollapsed = shouldCollapse
currentHeight = shouldCollapse ? 0 : maxExpandedHeight
isDragging = false
}
}
)
VStack(spacing: 10) {
headerRow
summaryRow(title: "Subtotal", value: transaction.subtotal)
.font(.subheadline)
.foregroundStyle(.secondary)
ScrollView(.vertical) {
VStack {
ForEach(transaction.modifications) { mod in
modificationCard(mod)
.onSwipeToDelete {
deleteMod(mod)
}
.scrollTargetLayout()
}
}
}
.contentMargins(.trailing, 10, for: .scrollContent)
.scrollTargetBehavior(.paging)
.frame(maxHeight: maxExpandedHeight)
Divider().padding(.vertical, 4)
}
.frame(height: currentHeight, alignment: .top)
.animation(.snappy, value: currentHeight)
.clipped()
summaryRow(title: "Total", value: transaction.total())
.font(.title2.bold())
}
.padding()
.background(.ultraThinMaterial)
.clipShape(RoundedRectangle(cornerRadius: 24, style: .continuous))
.overlay(
RoundedRectangle(cornerRadius: 24)
.strokeBorder(.white.opacity(0.1), lineWidth: 1)
)
.shadow(color: .black.opacity(0.1), radius: 10, x: 0, y: 5)
.padding(.horizontal)
.onAppear {
currentHeight = isCollapsed ? 0 : maxExpandedHeight
}
.animation(.spring(response: 0.25, dampingFraction: 0.9, blendDuration: 0.2), value: isCollapsed)
.allowsHitTesting(true)
}
< /code>
Я попытался добавить анимацию, чтобы попытаться сгладить движение, добавить задержки между обновлением перевода перетаскивания, добавив проверку на небольшие изменения в переводе и т. Д., Но, кажется, ничего не работает. Любая помощь будет оценена!
Подробнее здесь: [url]https://stackoverflow.com/questions/79784829/resizing-frame-with-draggesture-causes-jittering[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия