微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决在 SwiftUI 中,如何在不导致编译器错误的情况下在 x 和 y 中使用偏移量进行动画处理

我无法同时在 x 和 y 中使用偏移量进行动画处理,我想知道如何进行更改以成功构建。

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

如果我更改注释以允许 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
)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。