Swift 5, iOS 13
Я запускаю этот код, он работает.
var body: some View {
...
Button(action: {
self.animateTLeft()
quest = quest + "1"
}) { Wedge(startAngle: .init(degrees: 180), endAngle: .init(degrees: 270))
.fill(Color.red)
.frame(width: 200, height: 200)
.offset(x: 95, y: 95)
.scaleEffect(self.tLeft ? 1.1 : 1.0)
}.onReceive(rPublisher) { _ in
self.animateTLeft()
}
...
}
private func animateTLeft() {
withAnimation(.linear(duration: 0.25)){
self.tLeft.toggle()
}
DispatchQueue.main.asyncAfter(deadline: .now() + 0.25, execute: {
withAnimation(.linear(duration: 0.25)){
self.tLeft.toggle()
}
})
}
И я хочу попробовать некоторые альтернативные подходы не , используя GCD если возможно. Поэтому я попытался использовать таймер, который не компилируется. И я попытался использовать перформанс, который также не компилировался. Так что я попробовал операции, которые скомпилированы! :). Но, к сожалению, тогда работает только один раз. Нет ли альтернативы GCD.
private func animateTLeft() {
//perform(#selector(animate), with: nil, afterDelay: 0.25)
//Timer.scheduledTimer(timeInterval: 0.15, target: self, selector: #selector(animateRed), userInfo: nil, repeats: false)
let queue = OperationQueue()
let operation1 = BlockOperation(block: {
withAnimation(.linear(duration: 1)){
self.tLeft.toggle()
}
})
let operation2 = BlockOperation(block: {
withAnimation(.linear(duration: 1)){
self.tLeft.toggle()
}
})
operation2.addDependency(operation1)
queue.addOperations([operation1,operation2], waitUntilFinished: true)
}
Почему я хочу это сделать, потому что у меня есть четыре фрагмента, которые я хочу анимировать, но я хочу меньше кода. У меня есть красный, зеленый, желтый и синий ломтик. Я написал стандартную подпрограмму c для их анимации, предоставив цвет в качестве параметра. Это мой код.
private func animateSlice(slice: inout Bool) {
withAnimation(.linear(duration: 0.25)){
slice.toggle()
}
DispatchQueue.main.asyncAfter(deadline: .now() + 0.25, execute: {
withAnimation(.linear(duration: 0.25)){
slice.toggle()
}
})
}
Но это не скомпилируется с параметром inout, который выдает красное сообщение об ошибке «Escapeing closure захватывает параметр inout« slice », что не очень хорошо. Я могу сделать копию, а не в параметре inout. Это компилируется, но, конечно, не работает, потому что это не меняет глупое значение.
Также попытался, но это не скомпилируется. Может быть, кто-то может заставить это работать.
private func animateSliceX(slice: String) {
var ptr = UnsafeMutablePointer<Bool>.allocate(capacity: 1)
switch slice {
case "red": ptr = &tLeft
case "green": ptr = &tRight
case "yellow": ptr = &bLeft
default: ptr = &bRight
}
withAnimation(.linear(duration: 0.25)){
ptr.toggle()
}
DispatchQueue.main.asyncAfter(deadline: .now() + 0.25, execute: {
withAnimation(.linear(duration: 0.25)){
ptr.toggle()
}
})
}
Спасибо ...