繁体   English   中英

在 SwiftUI 中,如何在 x 和 y 中使用偏移量进行动画处理而不会导致编译器错误

[英]In SwiftUI how can I animate with an offset in both x and y without causing a compiler error

我无法同时在 x 和 y 中使用偏移量设置动画,并且想知道如何更改内容以便成功构建。

我可以如图所示成功构建(y 动画正确,x 使用 0),或者我可以交换评论并让 x 正确动画,y 使用 0 或 0。

如果我更改注释以允许 x 和 y 进行动画处理(不使用 0 作为表达式的第一部分),编译器将失败并出现可怕的“编译器无法在合理的时间内对该表达式进行类型检查;尝试分解表达式转换成不同的子表达式”。

我尝试过以许多不同的方式进行重构,并且我设置和使用常量 a 和 i 的方式是我可以管理的最简单的方式(并且我尝试了许多不同的方式!)

                    ZStack {
                        let numSlots = kidsMaxSlots
                        let gwidth = geometry.size.width
                        let gameplayArea = geometry.size.height * gwidth
                        let slotsArea = gameplayArea / CGFloat(numSlots)
                        let slotSize = slotsArea.squareRoot()
                        let widthInSlots = Int(geometry.size.width / slotSize + 0.5)
                        let newSlotSize = geometry.size.width / CGFloat(widthInSlots)
                        let a = Int(geometry.size.width / (geometry.size.width / CGFloat(Int(geometry.size.width / (geometry.size.height * geometry.size.width / CGFloat(numSlots)).squareRoot() + 0.5))))
                        let i = (geometry.size.width / (geometry.size.height * geometry.size.width / CGFloat(numSlots)).squareRoot()).rounded()
                        let myShift = newSlotSize / 2
                        ForEach(gameplayDisplayArea.slotsArray.indices){ mySequence in
                            gameplayDisplayArea.slotsArray[gameplayDisplayArea.slotsArray[mySequence].id].slotImage
                                .resizable()
                                .frame(width: newSlotSize, height: newSlotSize)
                                .background(Color.green.opacity(0.4))
                                .position(
                                    x: myShift + CGFloat(mySequence % a) * newSlotSize,
                                    y: myShift + CGFloat(mySequence / widthInSlots) * newSlotSize
                                )
                                .offset(x: self.myAnimDefs.startAnimation ?
//                                            geometry.size.width / 2 - myShift - CGFloat(mySequence % a) * newSlotSize
                                          0
                                            : 0,
                                        y: self.myAnimDefs.startAnimation ?
                                            geometry.size.height - CGFloat(floor(CGFloat(mySequence) / i)) * newSlotSize
//                                            0
                                            : 0)
                        }

确认!

我忘记了我想要实现的目标,并一直试图以这种方式实现它。 知道如何根据我原来的问题构建编译器仍然会很好。

我现在意识到我可以通过像这样使用.position 来实现我想要的:

.position(x: self.myAnimDefs.startAnimation ?
            geometry.size.width / 2
            : myShift + CGFloat(mySequence % a) * newSlotSize,
          y: self.myAnimDefs.startAnimation ?
            geometry.size.height + myShift
            : myShift + CGFloat(mySequence / widthInSlots) * newSlotSize
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM