SwiftUI-在当前视图中设置新图像的动画

SwiftUI-在当前视图中设置新图像的动画,swiftui,Swiftui,我有一个视图,其中我使用图片(图像)子视图来显示图像,图像可以有不同的高度和宽度格式 对图像的引用是从一个数组中提取的,该数组允许我通过改变引用在视图中显示不同的图像。SwiftUI为每个新图像重新排列视图内容 我想在这个图像上的动画,比如说缩放效果,当图像显示 1) 我需要一个first.animation(nil)来避免为前一个图像设置动画(否则我会有一个难看的淡出和纵横比变形)。看来是个好办法 2) 但是scaleEffect修饰符有一个问题(即使我将其设置为scale=1,它不应该做任何

我有一个视图,其中我使用图片(图像)子视图来显示图像,图像可以有不同的高度和宽度格式

对图像的引用是从一个数组中提取的,该数组允许我通过改变引用在视图中显示不同的图像。SwiftUI为每个新图像重新排列视图内容

我想在这个图像上的动画,比如说缩放效果,当图像显示

1) 我需要一个first.animation(nil)来避免为前一个图像设置动画(否则我会有一个难看的淡出和纵横比变形)。看来是个好办法

2) 但是scaleEffect修饰符有一个问题(即使我将其设置为scale=1,它不应该做任何事情) 动画通过强制图像2的左上角从图像1的左上角开始的位置从图像1移动到图像2,这会以不同的宽度和高度引起图像中心的不必要平移
这在下面的代码中重现,出于演示目的,我使用系统映像(不容易出现bug 1))

我怎样才能避免呢

3) 在下面的演示代码中,我用一个按钮触发新图像,它允许我使用一个动作并处理“缩放”修改,并显式地实现所需的效果。然而,在我的真实代码中,图像修改是由另一个视图中的另一个更改触发的

斯威夫特知道这一点,因此我可以使用隐式.animation修改器

然而,我不知道如何对任何新图像强制“缩放”重置并执行我想要的效果

  • 如果我使用onAppear(我的代码),它只适用于显示的第一个图像,而不适用于以下图像

  • 在实际代码中,我有一个Picture(image)视图,Picture(image.animation())不编译

你知道如何在下面的代码中实现动作按钮上的隐式动画吗

谢谢

import SwiftUI

let portrait = Image(systemName: "square.fill")
let landscape = Image(systemName: "square.fill")

struct ContentView: View {
    @State var modified = false
    @State var scale: CGFloat = 1

var body: some View {
    return VStack(alignment: .center) {

        Pictureclip(bool: $modified)  
            .animation(nil)
            .scaleEffect(scale)
            .animation(.easeInOut(duration: 1))

       Button(action: {
        self.modified.toggle()
        self.scale = 1.1
        DispatchQueue.main.asyncAfter(deadline: .now() + 1)
            {self.scale = 1}
        }) {
            Text("Tap here")
                .animation(.linear)
        }            
     }
}
}
struct Pictureclip: View {

  @Binding var bool: Bool

  var body: some View {
  if bool == true {
    return  portrait
        .resizable()
        .frame(width: 100, height: 150)
        .foregroundColor(.green)
  } else {
   return  landscape
        .resizable()
        .frame(width: 150, height: 100)
        .foregroundColor(.red)
    }
    }
}

我对我的问题有一个半答案,即第1点和第2点(此处参考资产目录中的两个jpeg图像)

此解决方案支持缩放,而不会在动画期间扭曲新图像的纵横比。但在另一个视图中触发图像更新的代码中,它不起作用。我想我必须重新构造我的代码,要么解决我的问题,要么更清楚地暴露它


编辑:一个快速而肮脏的解决方案是将触发代码(这里是按钮中的操作代码)放在另一个视图中。也就是说,在视图B中放置为视图A设置动画的代码,并将状态变量传递给它(此处为“缩放”)。我肯定有更干净的方法,但至少这是可行的

我对我的问题有一个半答案,即第1点和第2点(此处参考资产目录中的两幅jpeg图像)

此解决方案支持缩放,而不会在动画期间扭曲新图像的纵横比。但在另一个视图中触发图像更新的代码中,它不起作用。我想我必须重新构造我的代码,要么解决我的问题,要么更清楚地暴露它


编辑:一个快速而肮脏的解决方案是将触发代码(这里是按钮中的操作代码)放在另一个视图中。也就是说,在视图B中放置为视图A设置动画的代码,并将状态变量传递给它(此处为“缩放”)。我肯定有更干净的方法,但至少这是可行的

我不确定,但也许对你有帮助。 使用数据绑定结构。我是这样使用它的:

let binding = Binding<String>(get: {
            self.storage
        }, set: { newValue in
            self.textOfPrimeNumber = ""
            self.storage = newValue
            let _ = primeFactorization(n: Int(self.storage)!, k: 2, changeable: &self.textOfPrimeNumber)
        })
let binding=binding(获取:{
自存储
},设置:{newValue in
self.textOfPrimeNumber=“”
self.storage=newValue
设uz=primeFactorization(n:Int(self.storage)!,k:2,可变:&self.textOfPrimeNumber)
})

我不确定,但也许这对你有帮助。 使用数据绑定结构。我是这样使用它的:

let binding = Binding<String>(get: {
            self.storage
        }, set: { newValue in
            self.textOfPrimeNumber = ""
            self.storage = newValue
            let _ = primeFactorization(n: Int(self.storage)!, k: 2, changeable: &self.textOfPrimeNumber)
        })
let binding=binding(获取:{
自存储
},设置:{newValue in
self.textOfPrimeNumber=“”
self.storage=newValue
设uz=primeFactorization(n:Int(self.storage)!,k:2,可变:&self.textOfPrimeNumber)
})

您使用哪个Xcode版本?如果没有
.animation(nil)
它在这里的动画效果非常好。使用Xcode 11.4/iOS 13.4进行测试。所以我不确定我是否得到了你想要达到的效果。是的,没有.animation(nil),如果你使用非jpeg图片,动画效果会很好,但是如果你放了真实图片(我在这里无法演示),它不会。(11.4). 您可以尝试使用let-grait=Image(“joconde”)let-scape=Image(“venus”)处理多张经过测试的jpeg图片仍然可以正常工作。您在横向和纵向模式下使用过jpeg吗?我肯定有一个动画,没有保持高宽比,一个乔康德看起来像一个博特罗人物,一个维纳斯看起来像一个巨人。这发生在画布和模拟器中,你使用哪个Xcode版本?如果没有
.animation(nil)
它在这里的动画效果非常好。使用Xcode 11.4/iOS 13.4进行测试。所以我不确定我是否得到了你想要达到的效果。是的,没有.animation(nil),如果你使用非jpeg图片,动画效果会很好,但是如果你放了真实图片(我在这里无法演示),它不会。(11.4). 您可以尝试使用let-grait=Image(“joconde”)let-scape=Image(“venus”)处理多张经过测试的jpeg图片仍然可以正常工作。您在横向和纵向模式下使用过jpeg吗?我有一个动画,没有保持高宽比,一个乔康德看起来像一个博特罗人物,一个维纳斯看起来像一个巨人,这发生在画布和模拟器中