Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在Swift中连续设置图像视图数组的动画?_Ios_Swift_Animation_Uiviewpropertyanimator - Fatal编程技术网

Ios 如何在Swift中连续设置图像视图数组的动画?

Ios 如何在Swift中连续设置图像视图数组的动画?,ios,swift,animation,uiviewpropertyanimator,Ios,Swift,Animation,Uiviewpropertyanimator,我想弄清楚这件事已经有一段时间了,但没有用。基本上,我有一个UIImageView数组,我想按顺序逐个设置动画。现在,它们都可以同时正确地设置动画。此外,我希望底部的代码仅在所有动画完成后执行,因为现在它似乎是同时执行的。我是swift的新手,所以我想我不完全理解for循环是如何工作的?在我看来,这段代码应该循环遍历数组中的所有图像视图,并且只有在完成之后才应该在底部执行代码。highlightCards方法应该在循环的每次迭代中调用,但这似乎也没有发生。我知道在移动正确的图像时,阵列已正确启动

我想弄清楚这件事已经有一段时间了,但没有用。基本上,我有一个UIImageView数组,我想按顺序逐个设置动画。现在,它们都可以同时正确地设置动画。此外,我希望底部的代码仅在所有动画完成后执行,因为现在它似乎是同时执行的。我是swift的新手,所以我想我不完全理解for循环是如何工作的?在我看来,这段代码应该循环遍历数组中的所有图像视图,并且只有在完成之后才应该在底部执行代码。highlightCards方法应该在循环的每次迭代中调用,但这似乎也没有发生。我知道在移动正确的图像时,阵列已正确启动

代码如下:

playedCards是一个包含卡片索引的整数数组

游戏。棋盘是一组卡片对象(UIImageView)

highlightCards()只突出显示当前可玩的卡

完成块中的代码仅用于后勤,我知道它工作正常

“设置新游戏”注释下的代码应在所有动画完成后执行

0中的i的
。。空出
self.game.board[self.game.playedCards[i]].center=endPoint
},完成日期:{
(Bool)->在
self.game.board[self.game.playedCards[i].removed=true
self.game.board[self.game.playedCards[i].removeFromSuperview()
self.currentCardCount=self.currentCardCount-1
})
}
//设置下一个转弯
game.blueTurn=!蓝转身
自我挫折
self.setSuitIndicators()
self.highlightCards()

你走对了路!这里唯一的问题是动画函数是异步运行的——这意味着它不会等到上一件事情完成动画后再进入下一个循环

在使用
completion
闭包的过程中,您已经是其中的一部分了。但是,如果要在上一个项目完成后等待为下一个项目设置动画,则必须找到从完成块内部再次运行属性animator的方法

最好的方法是提取对函数的属性动画调用。那就容易了

//这是一个包含代码段中包含的内容的函数。
func animateCards(){
//更新亮点
highlightCards()
//在屏幕外设置卡片动画
设端点:CGPoint=CGPoint(x:1000,y:250)
递归AnimateCard(位于:game.playedCards.startIndex,至:endPoint){
//设置下一个转弯
self.game.blueTurn=!self.game.blueTurn
自我挫折
self.setSuitIndicators()
self.highlightCards()
}
}
//此函数复制为所有内容设置动画的for循环。
func递归AnimateCard(索引处:Int,到端点:CGPoint,完成:()->Void){
//如果触发,我们已经遍历了所有的卡片。我们可以提前退出并启动完成处理程序。
守卫游戏。玩牌。索引。包含(索引)其他{
完成()
返回
}
UIViewPropertyAnimator.runningPropertyAnimator(持续时间:3,延迟:2,选项:UIView.AnimationOptions.curveEaseInOut,
动画:{
self.game.board[self.game.playedCards[index]].center=endPoint
}, 
完成:{uu英寸
self.game.board[self.game.playedCards[index]].removed=true
self.game.board[self.game.playedCards[index]].removeFromSuperview()
self.currentCardCount=self.currentCardCount-1
//完成后再次调用此函数,但用于下一张卡。
self.recursivelyAnimateCard(at:index+1,to:endPoint,completion:completion)
})
}

编辑:我没有看到你需要在整个事情完成后运行“下一轮”代码。我已经更新了上面的代码,以包含一个完成处理程序,该处理程序在所有卡片从屏幕上移除后启动。

非常感谢!这对我来说非常有效。我错过了一点知识,那就是动画师一下子就把所有的线都画出来了。