SwiftUI: смещение прокрутки при комбинировании перехода и тени - PullRequest
0 голосов
/ 20 марта 2020

Добавление тени к представлению с ScrollView и переходом, по-видимому, приводит к проблеме смещения при использовании onTapGesture на Scrollview. Пример кода ниже имеет вид, переходящий с тенью. Когда линия Shadow удалена, onTapGesture работает, как и ожидалось, однако тень затеняет Scrollview, поэтому onTabGesture выбирает неправильное изображение. Как только вы начнете прокручивать, смещение исчезнет, ​​и представление прокрутки будет работать так, как задумано. Я могу найти решение для устранения этой проблемы?

    import SwiftUI

struct ContentView: View {

  @State var transition : Bool = false
  @State var backgroundImage : Image

  var body: some View {
    VStack {
      Button( action: {withAnimation{self.transition.toggle()}})
        {Text("ScrollView").foregroundColor(.black)}
        .padding(20)
        .background(Color.blue)
        .padding(.bottom, 10)
      Spacer()
      if transition {pictureView1(image: $backgroundImage).transition(.slide)}
      Spacer()

    }

    .background(backgroundImage)
  }
}

struct ContentView_Previews: PreviewProvider {
  static var previews: some View {
    ContentView(backgroundImage: Image(uiImage: UIImage() ))
  }
}


//with Shadow, tapGesture picks wrong image, when shadow is removed, tapGesture picks correct image
struct pictureView1: View {

  var pictures : [String] = ["dog1","dog2","dog3","dog4","dog5"]
  @Binding var image : Image

  var body: some View {
    ScrollView(.horizontal) {
      HStack {
        ForEach(pictures, id: \.self) {picture in
          Image(picture).resizable().frame(width: 150, height: 200, alignment: .center)
            .onTapGesture {
              self.image = Image(picture)
          }
        }

      }
    }
    .frame(width: 350, height: 220)
    .background(Color.gray)
    .shadow(radius: 5, x: 5, y: 5) //with shadow removed, tapGesture works correctly, no scroll offset issue
  }
}

SceneDelegate:

 func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
    // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
    // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).

    // Create the SwiftUI view that provides the window contents.
    let contentView = ContentView(backgroundImage: Image(uiImage: UIImage()) )
...