Добавление тени к представлению с 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()) )