Tenho uma visualização em que cada item da lista tem ações de deslizar à frente/à direita. Quando adiciono um reconhecedor de gestos de arrastar à visualização, as ações de deslizar se tornam muito difíceis de acionar. Quero adicionar um gesto de arrastar à visualização para permitir que deslizamentos personalizados nas bordas (esquerda ou direita) naveguem para uma visualização diferente. Só preciso que esse gesto de arrastar reconheça as bordas esquerda e direita da tela (é isso que as cores cinzas representam). Como posso fazer com que as ações de deslizar sejam acionadas normalmente enquanto tenho o gesto para deslizamentos nas bordas?
import SwiftUI
struct swipeTest: View {
@State var offset = 0.0
var body: some View {
VStack {
List {
ForEach(0..<60, id: \.self) { _ in
RoundedRectangle(cornerRadius: 10)
.frame(height: 50).foregroundStyle(.blue).padding(15)
.swipeActions(edge: .trailing) {
Button(action: {
}, label: {
Image(systemName: "bell")
}).tint(.orange)
}
.swipeActions(edge: .leading) {
Button(action: {
}, label: {
Image(systemName: "pin")
}).tint(.green)
}
}
}.listStyle(.plain)
}
.offset(x: offset)
.overlay(alignment: .leading, content: {
// Only need swipe on very left edge
Color.gray.opacity(0.3).frame(width: 15)
})
.overlay(alignment: .trailing, content: {
// Only need swipe on very right edge
Color.gray.opacity(0.3).frame(width: 15)
})
.simultaneousGesture (
DragGesture()
.onChanged({ value in
let width = widthScreen()
if value.startLocation.x < 15.0 || value.startLocation.x > (width - 15.0) {
offset = value.translation.width
}
})
.onEnded({ value in
offset = 0.0
})
)
}
}
func widthScreen() -> CGFloat {
let scenes = UIApplication.shared.connectedScenes
let windowScene = scenes.first as? UIWindowScene
let window = windowScene?.windows.first
return window?.screen.bounds.width ?? 0
}
#Preview {
swipeTest()
}
Você já adicionou sobreposições cinzas para indicar onde o gesto de arrastar personalizado deve ser ativado, então basta adicionar o gesto a essas
Color.gray
sobreposições!Claro, no seu código real você pode querer usar um
Color.clear
, para esconder essa região do usuário. Aqui está um exemplo:Note que eu mudei
offset
para um@GestureState
, já que seu código o redefine para 0 após o término do gesto. Também tomei a liberdade de adicionar uma animação quando o deslocamento retorna. No seu código real, você disse que queria "navegar para uma visualização diferente", mas não está claro apenas pela sua pergunta como exatamente você quer fazer isso, então vou deixar essa parte para você.