【发布时间】:2016-04-04 01:07:35
【问题描述】:
我正在创建一个游戏,当我单击一个名为“开始”的按钮时,正在创建的按钮会从屏幕的一侧移动到另一侧。问题是,当我在移动的按钮到达终点之前单击开始时,它会停止而不是继续(并且另一个创建的按钮开始按预期移动)。 每次单击开始按钮时都应该创建一个新的 CADisplayLink 吗?如果是这样,我该怎么做?代码如下:
var button1 = UIButton()
var displayLink: CADisplayLink?
var startTime: CFAbsoluteTime?
let duration = 2.0
var leadingConstraint: NSLayoutConstraint!
var topConstraint: NSLayoutConstraint!
var l1 = false
@IBAction func start(sender: UIButton) {
n1()
}
func n1() {
l1 = false
startTime = CFAbsoluteTimeGetCurrent()
displayLink = CADisplayLink(target: self, selector: "handleDisplayLink:")
displayLink?.addToRunLoop(NSRunLoop.mainRunLoop(), forMode: NSRunLoopCommonModes)
}
func handleDisplayLink(displayLink: CADisplayLink) {
if l1 == false { // so it doesn't randomize leading constraint twice
button1 = createButton()
let randomNumber = Int(arc4random_uniform(180) + 30)
let elapsed = CFAbsoluteTimeGetCurrent() - startTime!
var percentComplete = CGFloat(elapsed / duration)
if percentComplete >= 1.0 {
percentComplete = 1.0
// self.button1.removeFromSuperview()
displayLink.invalidate()
button1.hidden = true
}
leadingConstraint.constant = CGFloat(randomNumber)
topConstraint.constant = 390 - 350 * percentComplete
NSLayoutConstraint.activateConstraints([
leadingConstraint,
topConstraint,
button1.widthAnchor.constraintEqualToConstant(75),
button1.heightAnchor.constraintEqualToConstant(75)
])
l1 = true
}
else{
let elapsed = CFAbsoluteTimeGetCurrent() - startTime!
var percentComplete = CGFloat(elapsed / duration)
if percentComplete >= 1.0 {
percentComplete = 1.0
displayLink.invalidate()
button1.hidden = true
}
topConstraint.constant = 390 - 350 * percentComplete
NSLayoutConstraint.activateConstraints([
leadingConstraint,
topConstraint,
button1.widthAnchor.constraintEqualToConstant(75),
button1.heightAnchor.constraintEqualToConstant(75)
])
}
}
func buttonPressed(sender: UIButton!) {
button1.hidden = true
displayLink?.invalidate()
}
func createButton() ->UIButton {
let button = UIButton()
button.setImage(UIImage(named: "BlueBall.png")!, forState: UIControlState.Normal)
button.addTarget(self, action: "buttonPressed:", forControlEvents: UIControlEvents.TouchUpInside)
self.view.addSubview(button)
button.translatesAutoresizingMaskIntoConstraints = false
leadingConstraint = button.leadingAnchor.constraintEqualToAnchor(view.leadingAnchor, constant: 0)
topConstraint = button.topAnchor.constraintEqualToAnchor(view.topAnchor, constant: 0)
NSLayoutConstraint.activateConstraints([
leadingConstraint,
topConstraint,
button.widthAnchor.constraintEqualToConstant(75),
button.heightAnchor.constraintEqualToConstant(75)
])
return button
}
请帮忙。这将不胜感激。提前致谢。安东
【问题讨论】:
-
我不会使用 CADisplayLink;而是创建一个具有所需约束的按钮,并通过 UIView.animate... 为约束设置动画... 每次添加另一个按钮时。这应该将新创建的按钮始终移动到所需目标目的地的末尾。如果您以后不需要它,您也可以添加并忘记约束。
-
@Christian 'fuzi' Orgler 我一直在避免使用 UIView.animate,因为我已经看到整个过程的移动速度不同(开始和结束时较慢)。我相信检测按钮上的触摸也更难(我相信只有使用 .presentationlayer 才能做到这一点)
-
听起来你的动画有缓动,如果你放 UIViewAnimationOptionsCurveLInear 那么它是一个线性动画:) 你必须在移动过程中检测按钮的触摸吗?
-
@Christian 'fuzi' Orgler 是的,这很重要
-
但是我不会将 UIButton 用于这个游戏驱动的目的。您可以使用存储的 UIViews 并检查 touchDidBegan 等并触发操作。或者使用 SceneKit 等特定于游戏的框架。
标签: ios swift uibutton swift2 cadisplaylink