我试图在swift中为一些bezier路径设置动画,我需要让它们中的一些在设置延迟后启动。为此,我必须在viewDidLoad函数中编写这两组代码。
以下是一些具有相同想法的示例代码:
override func viewDidLoad() {
super.viewDidLoad
func testFunc() {
println("Hello")
}
var frontOfBaseTimer = NSTimer.scheduledTimerWithTimeInterval(3, target: self, selector: Selector("testFunc"), userInfo: nil, repeats: false)
}
这会在加载视图3秒后使应用程序崩溃。错误消息让我相信在这种情况下唯一的问题是目标属性。
我应该在这里做些什么才能让它发挥作用?
答案 0 :(得分:1)
如果您已经绑定并决定使用自己的延迟循环,请考虑使用GCD和dispatch_after方法。该方法接受一个闭包并在指定的延迟后调用闭包,这几乎就是你想要的。您将为队列参数传递nil,因此您的闭包将在主队列上运行。
我创建了一个全局函数延迟,让我可以轻松地调用dispatch_async,而不必弄清楚它的混乱参数:
func delay(delay: Double, block:()->())
{
let nSecDispatchTime = dispatch_time(DISPATCH_TIME_NOW,
Int64(delay * Double(NSEC_PER_SEC)));
let queue = dispatch_get_main_queue()
dispatch_after(nSecDispatchTime, queue, block)
}
你这样称呼它:
delay(2.0)
{
//code to fire after a delay
}
答案 1 :(得分:0)
这样做,你的应用程序崩溃,因为,计时器调用已在viewdidload
方法中添加的函数。
override func viewDidLoad() {
super.viewDidLoad()
var frontOfBaseTimer =
NSTimer.scheduledTimerWithTimeInterval(3,
target: self,
selector: Selector("testFunc"),
userInfo: nil,
repeats: false)
}
func testFunc() {
println("Hello")
}
答案 2 :(得分:0)
试试这个: -
override func viewDidLoad() {
super.viewDidLoad()
var frontOfBaseTimer =
NSTimer.scheduledTimerWithTimeInterval(3,
target: self,
selector:"testFunc",
userInfo: nil,
repeats: false)
}
func testFunc(){
println("hello its me")
}
答案 3 :(得分:0)
我刚刚对其进行了测试,并确认您无法使用嵌套函数作为NSTimer的选择器。定时器调用的方法需要在目标的全局范围内定义。
如果您正在尝试制作动画,为什么不使用UIView动画?该系列方法包括延迟参数。
您也可以使用Core Animation。通过将bezierPath中的CGPath安装到形状图层中,然后将形状图层的路径更改为CABasicAnimation的一部分,可以非常轻松地为路径设置动画。
使用Core Animation可以制作非常流畅,干净的动画。
我在Github上有一个名为RandomBlobs的项目,它展示了如何使用CAShapeLayers和CABasicAnimations为Bezier路径设置动画。它是用Objective-C编写的,但这些技术直接适用于Swift。