2014-11-11 4 views
1

У меня возникли проблемы с отменой UILongPressGesture. Жест подключен к кнопке, и когда кнопка нажата, avaudiorecorder начинает запись звука. Я хочу, чтобы запись звука прекращалась, когда я отключаюсь от кнопки. Любая помощь приветствуется, спасибо!Отмена UILongPressGesture

@IBAction func recordAudio(sender: AnyObject) 
{ 
    if sender.state == UIGestureRecognizerState.Ended 
    { 
     session.setCategory(AVAudioSessionCategoryPlayback, error: nil) 
     recorder.stop() 
     recordButton.backgroundColor = UIColor.whiteColor() 
     save() 
    } 
    else if sender.state == UIGestureRecognizerState.Began 
    { 
     session.setCategory(AVAudioSessionCategoryRecord, error: nil) 
     recorder.record() 
     recordButton.backgroundColor = UIColor.greenColor() 
    } 
    else if sender.state == UIGestureRecognizerState.Cancelled 
    { 
     recorder.stop() 
     recordButton.backgroundColor = UIColor.redColor() 
    } 
} 

EDIT - Take 2

@IBAction func recordAudio(sender: UILongPressGestureRecognizer) 
{ 
    switch (sender.state) 
    { 
     case .Ended: 
      session.setCategory(AVAudioSessionCategoryPlayback, error: nil) 
      recorder.stop() 
      recordButton.backgroundColor = UIColor.whiteColor() 
      save() 
     case .Began: 
      session.setCategory(AVAudioSessionCategoryRecord, error: nil) 
      recorder.record() 
      recordButton.backgroundColor = UIColor.greenColor() 
     case .Cancelled, .Ended: 
      recorder.stop() 
      recordButton.backgroundColor = UIColor.redColor() 
     default: 
      break 
    } 
} 

EDIT - Возьмите 3 (почти нет)

@IBAction func recordAudio(sender: UILongPressGestureRecognizer) 
{ 
    switch (sender.state) 
    { 
     case .Ended: 
      session.setCategory(AVAudioSessionCategoryPlayback, error: nil) 
      recorder.stop() 
      recordButton.backgroundColor = UIColor.whiteColor() 
      post() 
     case .Began: 
      session.setCategory(AVAudioSessionCategoryRecord, error: nil) 
      recorder.record() 
      recordButton.backgroundColor = UIColor.greenColor() 
     case .Cancelled: 
      recorder.stop() 
      recordButton.backgroundColor = UIColor.redColor() 
     case .Changed: 
      let touchLocation = recordGesture.locationInView(recordButton) 
      if (!CGRectContainsPoint(recordButton.bounds, touchLocation)) 
      { 
       // touch is outside of button 
       recorder.stop() 
       recordButton.backgroundColor = UIColor.whiteColor() 
       break 
      } 
     default: 
      break 
    } 
} 

Этот код работает, единственная проблема в том, что .Ended еще вызываемый после того, как жест изменился, и я отбрасываю палец с экрана.

+0

Вы можете попробовать добавить упражнение к кнопке 'UIControlEventTouchDragOutside'. Вы уверены, что не сможете получить эту функциональность от UIButton, я не уверен, что вам нужен жест. – BooRanger

+0

Кнопка не получит действие, потому что устройство распознавания касания уже коснулось касания. – Fogmeister

+0

так ли решение удаляет longpressgesture вообще? – user3353890

ответ

1

Когда прикосновение длинного распознавателя жестов нажатия перемещается, функция вызывается с состоянием UIGestureRecognizerStateChanged.

Я хотел бы изменить свой код, как это ...

@IBAction func recordAudio(sender: AnyObject) 
{ 
    switch (sender.state) { 
     case .Ended: 
      session.setCategory(AVAudioSessionCategoryPlayback, error: nil) 
      recorder.stop() 
      recordButton.backgroundColor = .whiteColor() 
      save() 
     case .Began: 
      session.setCategory(AVAudioSessionCategoryRecord, error: nil) 
      recorder.record() 
      recordButton.backgroundColor = .greenColor() 
     case .Cancelled: 
      recorder.stop() 
      recordButton.backgroundColor = .redColor() 
     case .Changed: 
      // detect if the touch has gone outside of the button and stop the recording 
     default: 
      // do nothing 
    } 
} 

Для обнаружения, если сенсорный внутри кнопки

Вы можете сделать что-то вроде этого ..

let touchLocation = recognizer.locationInView(recordButton) 

if (!CGRectContainsPoint(recordButton.bounds, touchLocation)) { 
    // touch is outside of button 
} 

Не тестировалось или ничего. Просто набрал от руки в Safari.

+0

Я получаю сообщение об ошибке: «не удалось найти перегрузку для« состояния », которая принимает предоставленные аргументы» ... Я полагаю, что это связано с тем, что отправитель объявлен AnyObject? – user3353890

+0

Я изменил отправителя на UILongPressGestureRecognizer и добавил случай по умолчанию, но, к сожалению, он не отменил, когда я отошел от кнопки:/ – user3353890

+0

Можете ли вы изменить свой вопрос, чтобы показать, что вы код. Вам нужно фактически обнаружить, что он отошел от кнопки вручную. – Fogmeister

Смежные вопросы