2015-12-10 1 views
1

У меня проблема в моем приложении. Я хочу, чтобы это произошло, когда я нажимаю кнопку2, она исчезает и перестает двигаться. Что происходит сейчас, так это то, что когда я нажимаю кнопку2, он исчезает, но не перестает двигаться (даже когда он скрыт). Любая помощь? Код:Как приостановить CADisplayLink?

@IBOutlet var label: UILabel! 
@IBOutlet var label2: UILabel!  
@IBOutlet var label3: UILabel! 
@IBOutlet var button2: UIButton! 
@IBAction func button3(sender: UIButton) { 
    label.hidden = false 
button2.hidden = true 
} 
@IBOutlet var button4: UIButton! 
@IBAction func button5(sender: UIButton) { 
button4.hidden = true 
label2.hidden = false 
} 
@IBAction func button1(sender: UIButton) { 
    label.hidden = true 
    label2.hidden = true 
    button2.hidden = false 
     button2.frame = CGRectMake(120, 400, 100, 100) 
    let displayLink = CADisplayLink(target: self, selector: "handleDisplayLink:") 
    displayLink.addToRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode) 
    let time = dispatch_time(dispatch_time_t(DISPATCH_TIME_NOW), 2 * Int64(NSEC_PER_SEC)) 
    dispatch_after(time, dispatch_get_main_queue()) { 
     self.button4.hidden = false 
    self.button4.frame = CGRectMake(120, 400, 100, 100) 
    let displayLink1 = CADisplayLink(target: self, selector: "handleDisplayLink1:") 
     displayLink1.addToRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode)} 
    } 
func handleDisplayLink(displayLink: CADisplayLink) { 
    var buttonFrame = button2.frame 
    buttonFrame.origin.y += -2 
    button2.frame = buttonFrame 
    if button2.frame.origin.y <= 50 { 
     displayLink.invalidate() 
     label3.hidden = false 
     button2.hidden = true 
    } 
} 
func handleDisplayLink1(displayLink1: CADisplayLink) { 
    var button4Frame = button4.frame 
    button4Frame.origin.y += -2 
    button4.frame = button4Frame 
    if button4.frame.origin.y <= 50 { 
     displayLink1.invalidate() 
     label3.hidden = false 
     button4.hidden = true 
    } 
} 
override func viewDidLoad() { 
    super.viewDidLoad() 
    label.hidden = true 
    button2.hidden = true 
    label2.hidden = true 
    button4.hidden = true 
    label3.hidden = true 
    // Do any additional setup after loading the view, typically from a nib. 
} 

спасибо. Антон

ответ

0

Это чрезвычайно запутанное, потому что неясно, как в отношения между два выхода под названием button2 и button4 и методы @IBAction под названием button1, button3 и button5? Сколько кнопок у вас на самом деле? Два? 4? 5? А какие эти ярлыки? Если они не являются частью вопроса, они не должны включаться в фрагмент кода.

Но если это button3 или button5, который называется вызываемым, то да, те скрывают кнопку, но не invalidate ссылку на изображение, поэтому будет отображаться ссылка на изображение. Если вы хотите, чтобы остановить ссылку дисплея, то вы должны вызвать invalidate:

var displayLink: CADisplayLink? 
var displayLink1: CADisplayLink? 

@IBAction func button3(sender: UIButton) { 
    label.hidden = false 
    button2.hidden = true 
    displayLink?.invalidate() 
    displayLink = nil 
} 

@IBAction func button5(sender: UIButton) { 
    button4.hidden = true 
    label2.hidden = false 
    displayLink1?.invalidate() 
    displayLink1 = nil 
} 

Это, очевидно, означает, что button5 следует использовать эти свойства, не используя локальные переменные для displayLink и displayLink1:

@IBAction func button1(sender: UIButton) { 
    label.hidden = true 
    label2.hidden = true 
    button2.hidden = false 
    button2.frame = CGRectMake(120, 400, 100, 100) 
    // NB: No `let` on the next line 
    displayLink = CADisplayLink(target: self, selector: "handleDisplayLink:") 
    displayLink?.addToRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode) 

    let time = dispatch_time(dispatch_time_t(DISPATCH_TIME_NOW), 2 * Int64(NSEC_PER_SEC)) 
    dispatch_after(time, dispatch_get_main_queue()) { 
     self.button4.hidden = false 
     self.button4.frame = CGRectMake(120, 400, 100, 100) 
     // NB: No `let` on the next line 
     self.displayLink1 = CADisplayLink(target: self, selector: "handleDisplayLink1:") 
     self.displayLink1?.addToRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode) 
    } 
} 

несколько дополнительных наблюдений:

  1. Если вы используете автоматическую раскладку, вы должны быть очень осторожны о Jus t регулировка frame этих элементов управления. В автоматическом макете, если вам нужно что-либо сделать, чтобы запустить механизм ограничений, который будет применяться (например, обновите text этих меток), элементы управления вернутся туда, где определены ограничения.

  2. Вы меняете frame этих элементов управления, перемещая их по 2 очка за звонок. Это может закончиться заиканием или изменением скоростей интерфейса анимации, так как ваше приложение становится более сложным. Вы не должны обновлять фиксированную сумму за вызов обработчика ссылок на экран, а скорее использовать некоторые временные функции, чтобы определить, сколько времени прошло, и вычислить новые координаты.

  3. Я лично не использовал бы ссылки на ссылки для такого рода материалов. Я просто хотел бы использовать стандартный UIView.animateWithDuration, а затем, когда я хотел остановиться button2 двигаться, я бы:

    let currentButton2Frame = button2.layer.presentationLayer()!.frame 
    button2.layer.removeAllAnimations() 
    button2.frame = currentButton2Frame 
    

    Это определяет, где он, в середине анимации, останавливает анимацию, и сбрасывает frame по координатам ранее идентифицированных. Это позволяет избежать сложностей отображения ссылок.

+0

Для вашего третьего наблюдения, будет ли это работать, если бы у меня был таймер, работающий одновременно, или он обновит кадры и не сможет двигаться? –

+0

Анимация происходит без проблем параллельно с таймером. Единственный трюк, который Я попытался описать, когда вы останавливаете анимацию в своем таймере, просто изучите слой презентации, чтобы выяснить, где он находился в середине полета, и «переместить» его в это же место, поэтому он остается там, где это было, когда вы остановили анимацию в обработчик таймера. – Rob

+0

Я не уверен, что это то, о чем вы говорили, но когда я пытаюсь запустить приложение, это показывает: неожиданно найдено нуль при развертывании необязательного значения ... Что мне делать (что-то делать? необязательно?) –

0

Вам нужно сохранить ссылку на ссылки для ссылок, которые вы создаете в обработчике кликов. Таким образом, создать свойство уровня класса для них:

@IBAction func button5(sender: UIButton) { 
    button4.hidden = true 
    label2.hidden = false 
} 

// new code here: 
var displayLink: CADisplayLink? 
var displayLink1: CADisplayLink? 

Тогда аннулируют их, прежде чем создавать их, в случае, если экземпляр уже существует:

@IBAction func button1(sender: UIButton) { 
    displayLink?.invalidate() 
    displayLink1?.invalidate() 

    displayLink = CADisplayLink(target: self, selector: "handleDisplayLink:") 
    displayLink1 = CADisplayLink(target: self, selector: "handleDisplayLink1:") 

    displayLink = 
    label.hidden = true 
    label2.hidden = true 
    button2.hidden = false 

    // ... rest of your method 
} 
+0

Это не сработало ...:( –