Animation 使用SwiftUI计算/预测帧的未来中心

Animation 使用SwiftUI计算/预测帧的未来中心,animation,swiftui,scale,Animation,Swiftui,Scale,Swift 5.2,iOS 13 我想在缩放帧后预测/计算帧的中心点,以便在缩放时将形状移动到该帧。如果我尝试在动画/动态中缩放视图并使其居中,它将不起作用,最终结果可能是中心点的组合。在下图中,蓝色框从右上角开始,我缩放并移动到中间。但正如你从绿色框中看到的,缩放已经弄乱了它需要到达的点 我以为乔治·里德会是答案,但我也从中得到了垃圾。花了一个多星期的时间尝试定制路线、位置和我能想到的一切。目前,我们正在关注一个屏幕站点百分比的解决方案,但显然它在不同大小的屏幕上效果不太好。这里有一个解决方

Swift 5.2,iOS 13

我想在缩放帧后预测/计算帧的中心点,以便在缩放时将形状移动到该帧。如果我尝试在动画/动态中缩放视图并使其居中,它将不起作用,最终结果可能是中心点的组合。在下图中,蓝色框从右上角开始,我缩放并移动到中间。但正如你从绿色框中看到的,缩放已经弄乱了它需要到达的点

我以为乔治·里德会是答案,但我也从中得到了垃圾。花了一个多星期的时间尝试定制路线、位置和我能想到的一切。目前,我们正在关注一个屏幕站点百分比的解决方案,但显然它在不同大小的屏幕上效果不太好。

这里有一个解决方案(使用Xcode 11.4/iOS 13.4测试)

}

.scaleEffect(zoom)//我知道你是如何做到的,但我不明白你想实现什么。是从屏幕右上角放大到屏幕中央吗?如果我知道目标的话,我可能会提出不同的方法。@Asperi是的,从屏幕右上角放大到屏幕中央太过分了。右上角小,中间大。中间偏大,右上偏小。
struct SwiftUIView2: View {
@State var relocate = Alignment.topTrailing
@State var zoom:CGFloat = 1.0
@State var tag:Bool = true
@State var tag2:Bool = false
@State var centerPoint: CGPoint = .zero
var body: some View {
    ZStack {
        ZStack(alignment: relocate) {
            Rectangle()
                .stroke(Color.blue, lineWidth: 2)
                .frame(width: 32, height: 32, alignment: .center)
                .onTapGesture {
                    withAnimation {
                    if self.tag {
                        self.zoom = 2.0
                        self.relocate = Alignment.center
                    } else {
                        self.relocate = Alignment.topTrailing
                        self.zoom = 1.0
                    }
                    }
                    DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
                        self.tag.toggle()
                    }
                    
            }
            .scaleEffect(zoom, anchor: .topLeading)
        }.frame(width: 256, height: 256, alignment: relocate)
            .border(Color.red)
        if !tag {
                ZStack {
                    Rectangle()
                        .stroke(Color.green, lineWidth: 2)
                        .frame(width: 32, height: 32, alignment: .center)
                        .onTapGesture {
                            self.tag.toggle()
                    }
                }.frame(width: 256, height: 256, alignment: .center)
                    .scaleEffect(zoom, anchor: .center)
        }

    }
}
}
            }
            .scaleEffect(zoom)      // << here !! (remove topLeading anchor)
        }.frame(width: 256, height: 256, alignment: relocate)