Я создаю игру, в которой кнопка, которая создается, перемещается с одной стороны экрана на другую, когда я нажимаю кнопку, называемую start. Проблема в том, что когда я нажимаю кнопку запуска до того, как кнопка, которая двигается, достигает конечной точки, она останавливается, а не продолжает (и другая созданная кнопка начинает двигаться, как ожидалось). Должен ли я создавать новый 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
}
Пожалуйста, помогите. Было бы очень благодарно. Заранее спасибо. Anton
Я бы не использовать CADisplayLink; вместо этого создайте кнопку с нужными ограничениями и анимируйте ограничение через UIView.animate ... каждый раз, когда вы добавляете другую кнопку. Это должно перемещать вновь созданную кнопку всегда до конца желаемого целевого адресата. Также вы можете просто добавить и забыть ограничение, если оно вам не понадобится впоследствии. –
@Christian 'fuzi' Orgler Я избегаю UIView.animate, потому что я видел, что движение происходит не так же быстро, как все (медленнее в начале и в конце). Кроме того, я уверен, что обнаружил прикосновение к кнопке (я могу это сделать, только если я использую .presentationlayer, я считаю) –
Это звучит для меня, облегчая вашу анимацию, тогда, если вы поместите UIViewAnimationOptionsCurveLInear, то это линейная анимация :) Вам нужно определить касание кнопки во время движения? –