Я пытаюсь использовать .matchedgeMetryEffect в ScrollView, и используя другие посты стеков, я выяснил, как это сделать, не видя никаких предупреждающих сообщений, таких как: < /p>
Multiple inserted views in matched geometry group Pair(first: "AB0D062C-C14D-4A2A-8AC4-32CE12AF289FText", second: SwiftUI.Namespace.ID(id: 136)) have isSource: true, results are undefined.
< /code>
Мне интересно, является ли вышеупомянутое сообщение серьезным, или это то, с чем можно жить. Он связывается с анимацией, но не так сильно, как проблема ниже. Сопоставленная группа геометрии "для условного рендеринга? Это проблема. Я хочу сохранить свой анимированный переход, но также сохранить позицию прокрутки, когда я увольняю обратно к основному представлению. Зеленый квадрат - это 3 -й квадрат в прокрутке, и при увольнении вы можете увидеть красную квадрат за ним, который, как оказался 1 -й квадрат. Их, я чувствую, что должен сделать выбор между анимацией или позицией прокрутки. < /p>
Это все мой код: < /p>
struct Home: View {
@State private var colorStructs: [ColorStruct] = [
ColorStruct(color: .red),
ColorStruct(color: .blue),
ColorStruct(color: .green),
ColorStruct(color: .yellow)
]
@Namespace private var resultsNamespace
@State private var isPressed: Bool = false
@State var selectedColor: ColorStruct? = nil
@State private var scrollPosition: String? = nil // Track scroll position
@State private var lastScrollPosition: String? = nil // Save last position
var body: some View {
ZStack {
if !isPressed {
VStack {
ScrollView(.horizontal) {
LazyHStack(spacing: 0) {
ForEach(colorStructs, id: \.id) { color in
RoundedRectangle(cornerRadius: 25)
.fill(color.color.gradient)
.matchedGeometryEffect(id: color.id + "Color", in: resultsNamespace)
.padding(.horizontal, 15)
.containerRelativeFrame(.horizontal)
.overlay {
Text("\(color.id)")
.matchedGeometryEffect(id: color.id + "Text", in: resultsNamespace)
.padding(.horizontal)
}
.onTapGesture {
selectedColor = color
lastScrollPosition = scrollPosition
withAnimation(.spring(response: 0.6, dampingFraction: 0.8)) {
isPressed.toggle()
}
}
.id(color.id)
}
}
.scrollTargetLayout()
}
.scrollPosition(id: $scrollPosition)
.scrollTargetBehavior(.viewAligned)
.scrollIndicators(.hidden)
.frame(height: 250)
.safeAreaPadding(.vertical, 15)
.safeAreaPadding(.horizontal, 25)
}
}
if isPressed {
ExpandedView(
colorStruct: selectedColor ?? ColorStruct(color: .red),
dismiss: $isPressed,
namespace: resultsNamespace,
onDismiss: {
if let lastPos = lastScrollPosition {
scrollPosition = lastPos
}
}
)
}
}
.navigationTitle("Custom Indicator")
}
}
struct ExpandedView: View {
let colorStruct: ColorStruct
@Binding var dismiss: Bool
var namespace: Namespace.ID
var onDismiss: () -> Void
var body: some View {
ZStack {
RoundedRectangle(cornerRadius: 25)
.matchedGeometryEffect(id: colorStruct.id + "Color", in: namespace, isSource: false)
.frame(height: 550)
.foregroundStyle(colorStruct.color)
VStack {
Text("\(colorStruct.id)")
.matchedGeometryEffect(id: colorStruct.id + "Text", in: namespace, isSource: false)
.font(.largeTitle)
.fontWeight(.bold)
.offset(y: -150)
.padding(.horizontal)
}
}
.onTapGesture {
withAnimation(.spring(response: 0.6, dampingFraction: 0.8)) {
dismiss.toggle()
onDismiss()
}
}
.padding()
}
}
Я пробовал другие вещи, такие как использование Zindex () в каждом представлении и изменение Issource в MatchedgeMetryEffect, но это либо не онизило, либо имела ту же проблему, что и выше. /> Желаемое поведение: я бы хотел, чтобы анимация квадрата расширилась, а также сохраняла положение прокрутки, когда я оставлю вид дома. < /p>
Я пытаюсь использовать .matchedgeMetryEffect в ScrollView, и используя другие посты стеков, я выяснил, как это сделать, не видя никаких предупреждающих сообщений, таких как: < /p> [code]Multiple inserted views in matched geometry group Pair(first: "AB0D062C-C14D-4A2A-8AC4-32CE12AF289FText", second: SwiftUI.Namespace.ID(id: 136)) have isSource: true, results are undefined. < /code> Мне интересно, является ли вышеупомянутое сообщение серьезным, или это то, с чем можно жить. Он связывается с анимацией, но не так сильно, как проблема ниже. Сопоставленная группа геометрии "для условного рендеринга? Это проблема. Я хочу сохранить свой анимированный переход, но также сохранить позицию прокрутки, когда я увольняю обратно к основному представлению. Зеленый квадрат - это 3 -й квадрат в прокрутке, и при увольнении вы можете увидеть красную квадрат за ним, который, как оказался 1 -й квадрат. Их, я чувствую, что должен сделать выбор между анимацией или позицией прокрутки. < /p> Это все мой код: < /p> struct Home: View { @State private var colorStructs: [ColorStruct] = [ ColorStruct(color: .red), ColorStruct(color: .blue), ColorStruct(color: .green), ColorStruct(color: .yellow) ]
@Namespace private var resultsNamespace @State private var isPressed: Bool = false @State var selectedColor: ColorStruct? = nil
@State private var scrollPosition: String? = nil // Track scroll position @State private var lastScrollPosition: String? = nil // Save last position
var body: some View { ZStack { if !isPressed { VStack { ScrollView(.horizontal) { LazyHStack(spacing: 0) { ForEach(colorStructs, id: \.id) { color in RoundedRectangle(cornerRadius: 25) .fill(color.color.gradient) .matchedGeometryEffect(id: color.id + "Color", in: resultsNamespace) .padding(.horizontal, 15) .containerRelativeFrame(.horizontal) .overlay { Text("\(color.id)") .matchedGeometryEffect(id: color.id + "Text", in: resultsNamespace) .padding(.horizontal)
if isPressed { ExpandedView( colorStruct: selectedColor ?? ColorStruct(color: .red), dismiss: $isPressed, namespace: resultsNamespace, onDismiss: { if let lastPos = lastScrollPosition { scrollPosition = lastPos } } ) }
} .navigationTitle("Custom Indicator") } }
struct ExpandedView: View { let colorStruct: ColorStruct @Binding var dismiss: Bool var namespace: Namespace.ID var onDismiss: () -> Void
var body: some View { ZStack { RoundedRectangle(cornerRadius: 25) .matchedGeometryEffect(id: colorStruct.id + "Color", in: namespace, isSource: false) .frame(height: 550) .foregroundStyle(colorStruct.color)
VStack { Text("\(colorStruct.id)") .matchedGeometryEffect(id: colorStruct.id + "Text", in: namespace, isSource: false) .font(.largeTitle) .fontWeight(.bold) .offset(y: -150) .padding(.horizontal) } } .onTapGesture { withAnimation(.spring(response: 0.6, dampingFraction: 0.8)) { dismiss.toggle() onDismiss() } } .padding() } } [/code] Я пробовал другие вещи, такие как использование Zindex () в каждом представлении и изменение Issource в MatchedgeMetryEffect, но это либо не онизило, либо имела ту же проблему, что и выше. /> Желаемое поведение: я бы хотел, чтобы анимация квадрата расширилась, а также сохраняла положение прокрутки, когда я оставлю вид дома. < /p>
Скажите, что у меня есть представление о контейнере, которое я использую для применения последовательного стиля к различным содержащимся представлениям.
struct FormattedContainer: View {
let content: Content
Я внедряю функциональность для динамического добавления элементов к Scrollview, когда пользователь переходит к краям. Добавление элементов в конце списка работает, как и ожидалось, но я сталкиваюсь с проблемой при добавлении элементов в начало. В...
Я ищу решение для использования представления списка внутри представления прокрутки, но безуспешно 🥲
Результат, который мне нужен, похож на веб-страницу: в xaml у вас есть страница с представлением прокрутки, а для дочернего элемента - сетка и...
Я ищу решение для использования представления списка внутри представления прокрутки, но безуспешно 🥲
Результат, который мне нужен, похож на веб-страницу: в xaml у вас есть страница с представлением прокрутки, а для дочернего элемента - сетка и...
Вопрос:
Я работаю над приложением для Android, в котором динамически добавляю пользовательские представления, содержащие элементы TextView внутри ScrollView. Каждый TextView предназначен для независимой прокрутки, но я столкнулся с проблемой: если...