[英]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.