gpt4 book ai didi

ios - Swift - 减慢 "too fast"动画(UIImage 更新) - 也就是 NSTimer 是这里唯一的选择吗?

转载 作者:行者123 更新时间:2023-11-28 10:26:35 24 4
gpt4 key购买 nike

IOS 编程新手 - 通过 Swift 学习。我正在编写一个简单的“老虎机/骰子游戏”。

我试图在“实际”卷出现之前向用户显示一系列闪烁的卷。

func doFancyDiceRoll() {      
for x in 1...100 {
Die1.image = PipsImg[RollOne()]
Die2.image = PipsImg[RollOne()]
Die3.image = PipsImg[RollOne()]
}
}

Die1 等被定义为通用 UIImage View 。

无论如何,我没有看到 100 次迭代,只有循环结束时的图像。我假设它重绘“太快”或者 IOS 试图变得聪明,并且只绘制最后的图像以节省资源。

我会疯狂地猜测我需要在这里实现某种延迟,或者,需要告诉 IOS 明确绘制我的图像,而不是试图超越我的意图。

对于延迟,我看到了一些关于 NSTimer 的信息,但我所看到的似乎只是简单地说“暂停 .05”之类的东西,并且整个结构不清楚,因为它们是 ObjC 示例/转换。

(注意:我在这里简化了事情——通常,我会存储 RollOne() 的值,以便以后使用。我还想制作一个数组(或集合?),如 Die[1 ].image,但这是另一个问题。)

========== 编辑 =======

好的,所以我正在跟进更多我的原始代码,并与@doctordoder 的代码合并,以便我们可以更好地讨论。希望那是犹太洁食。 (如果这个附加问题太长,请告诉我直接发布冗长跟进的最佳方式。)

import UIKit

class ViewController: UIViewController {


//( stripping out stuff unneeded for discussion )

// refers to same label below - works but kosher??
@IBOutlet var btnRoll_x: UIView

@IBAction func btnRoll(sender: AnyObject) {
triggerRoll()
}

var timer : NSTimer? = nil
var rolls : Int = 0

func triggerRoll() {

//hiding is bad UI, but until i know how to "disable & dim"
btnRoll_x.hidden = true

timer = NSTimer.scheduledTimerWithTimeInterval(0.10, target: self, selector: "doFancyDiceRoll", userInfo: nil, repeats: true);

}

func doFancyDiceRoll() {

Die1.image = PipsImg[randomInt(6)]
Die2.image = PipsImg[randomInt(6)]
Die3.image = PipsImg[randomInt(6)]

if (++rolls > 10)
{
timer?.invalidate()
timer = nil
rolls = 0 // DCB added this presumed missing line
btnRoll_x.hidden = false //again, need to do this better
}
}

}

希望我的代码实现符合预期。为了(希望)清晰度,我做了一些小的调整。

好消息是我有工作代码。我只是有足够的了解才能到位,但我对某些细节感到模糊。

这是我(认为我)知道的...

我们在类的主层声明了一个 NSTImer 对象和一个滚动计数器。我注意到在我的原始版本中,我将滚动计数器限定在滚动函数本身内。我花了一段时间才明白为什么它不能存在于 DiceRoll 循环本身中,但现在我明白了。我将表达得很糟糕,但由于计时器将调用 DiceRoll 多个实例,因此它需要存在于函数之外。

按钮 btnRoll 被触摸,并调用 triggerRoll()。

为了防止用户在我们进行时触摸按钮,这使我们进入滚动计数器永远不会归零的状态,我隐藏了按钮。 (稍后我会想出如何正确地进入禁用状态。)

计时器已设置。它每 .1 秒触发一次(在限制范围内),并设置为重复。 (直到 .invalidate )。它通过 selector: 属性“调用”函数 doFancyDiceRoll。

因此,如前所述,最大的变化是 doFancy..Roll() 不再循环。它激发单个实例更新图像。它检查计数器,如果我们达到限制,我们会终止计时器,从而停止计时器(无效)。 (然后我取消隐藏按钮,使其再次可用。)

所以,我担心/想知道的一些事情:我得到了其他需要定期发生的事情的计时器的值(每秒带走健康,每 10 秒检查一次 GPS 位置,等等)。强制刷新屏幕似乎是一种奇怪的结构。

坦率地说,我本以为会看到这样的东西:

func doFancyDiceRoll() {      
for x in 1...100 {
Die1.image = PipsImg[RollOne()] // and 2 and 3 of course.....
VIewController.forceRedraw <<=== something like this, or maybe
ViewController.wait(.05) <<== this?? I dunno ;-)
}
}

相反,我们最终多了大约 20 行左右。我很想知道是否有其他方法可以保持循环完好无损。

无论如何,假设这是一个真正的方法,我想我的后续是如何传递参数,因为这不是“真正的”函数调用。试 选择器:“doFancyDiceRoll(40)”
没有被IDE反对,但是执行失败。

最佳答案

几天前我遇到了完全相同的问题,整个循环在刷新 View 之前完成,正如@doctordoder 提到的那样。使用 NSTimer 解决

var rollCount = 0
let arrayOfImages = ["image01", "image02", "image03"]

var timer = NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector: Selector("doFancyDiceRoll"), userInfo: nil, repeats: true)


func doFancyDiceRoll() {
if rollCount == 100 {
timer.invalidate
rollCount = 0
{
else {
//get images from array arrayOfImages[rollCount]
rollCount++
}
}

可能有拼写错误,因为我现在没有 Xcode。

关于ios - Swift - 减慢 "too fast"动画(UIImage 更新) - 也就是 NSTimer 是这里唯一的选择吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24525349/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com