SwiftUI Horizontal ScrollView onTapGesture, регистрирующий касания на вертикальной прокрутке позади него - PullRequest
1 голос
/ 02 августа 2020
• 1000 жест из вертикального вида.

вот мой код:

//
//  TestView.swift
//  iOS
//
//

import SwiftUI

struct TestView: View {
    @State var searchTerm = ""
    
    
    var body: some View {
        VStack {
            TextField("Search",text: $searchTerm)
                .padding()
                .background(
                    RoundedRectangle(cornerRadius:15).fill(Color.yellow)
                )
                .padding()
            ScrollView(.horizontal){
                HStack{
                    ForEach(1..<100){ index in
                        VStack {
                            Image(systemName: "swift")
                                .resizable()
                                .scaledToFit()
                                .padding()
                                .frame(width: 100, height: 100, alignment: .center)
                                .background(Color.gray)
                                .clipShape(Circle())
                            Text("item \(index)")
                        }
                        .onTapGesture{
                            print("horizontal list item tapped")
                        }
                        
                    }
                    
                }
                
            }
            
            
            ScrollView {
                VStack {
                    ForEach(1..<100) { index in
                        HStack {
                            Image(systemName: "swift")
                                .resizable()
                                .scaledToFit()
                                .frame(width: 50, height: 50, alignment: .center)
                            Text("vertical list item : \(index)")
                            Spacer()
                        }
                        .contentShape(Rectangle())
                        .onTapGesture{
                            print("vertical list item \(index) tapped")
                        }
                        
                    }
                    .padding(.all,5)
                    .background(
                        RoundedRectangle(cornerRadius:15).fill(Color.gray)
                    )
                    .padding(.all,5)
                    
                }
            }
            
        }
        .animation(.easeIn(duration: 10))
    }
    
}

struct TestView_Previews: PreviewProvider {
    static var previews: some View {
        TestView()
    }
}

до прокрутки После прокрутки

FYI: имея list вместо вертикальной прокрутки зафиксировал жесты касания, но я хотел бы иметь scrollview, потому что я хочу использовать ScrollViewReader для прокрутки элементов вертикального списка в качестве следующего шага

1 Ответ

1 голос
/ 02 августа 2020

Решение состоит в том, чтобы добавить обрезанную форму содержимого для обоих видов прокрутки, например

ScrollView(.horizontal){
     // .. content here
}.contentShape(Rectangle())
.clipped()

ScrollView {
     // .. content here
}.contentShape(Rectangle())
.clipped()

Протестировано с Xcode 12 / iOS 14

...