2014-11-15 2 views
0

Я пытаюсь реализовать функцию записи асинхронных голосовых сообщений. Есть кнопка, которая имеет UILongPressGestureRecognizer, и это начинает запись. Прямо сейчас, когда они отпускают, запись сохраняется и отправляется.Захват захвата вне UIControl - UILongPressGestureRecognizer

#pragma mark - Actions 
- (void) recordButtonPressed:(UILongPressGestureRecognizer *)gesture 
{ 
    if (gesture.state == UIGestureRecognizerStateBegan) { 
     [self.voiceRecorderView.recordButton setImage:[UIImage imageNamed:kWSGreyDotXLarge] forState:UIControlStateNormal]; 
     [self startRecording]; 

    } 
    if (gesture.state == UIGestureRecognizerStateEnded) { 

     [self stopRecording]; 
     [self.voiceRecorderView.recordButton setImage:[UIImage imageNamed:kWSPinkDotXLarge] forState:UIControlStateNormal]; 
    } 

} 

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

Как добавить gestureRecognizer, чтобы узнать, не перетаскивает ли пользователь внешний элемент управления, но все еще нажимает его?

ответ

1

@ ответ Джалил дал мне старт. Ниже приведена полная рабочая версия:

- (void) recordButtonPressed:(UILongPressGestureRecognizer *)gesture 
{ 
    if (gesture.state == UIGestureRecognizerStateBegan) { 

     [self.voiceRecorderView setCancelText:WSCancelLabelTextStart]; 

     if (!audioRecorder.recording) 
     { 
      [self startRecording]; 
     } 
     cancelflag = NO; 
    } 
    else if (gesture.state == UIGestureRecognizerStateChanged) 
    { 
     CGPoint touchPoint = [gesture locationInView:self.voiceRecorderView]; 

     if (!CGRectContainsPoint(self.voiceRecorderView.recordButton.frame, touchPoint)) { 
      cancelflag = YES; 
      [self.voiceRecorderView.recordButton setImage:[UIImage imageNamed:kWSGreyDotXLarge] forState:UIControlStateNormal]; 
      [self.voiceRecorderView setCancelText:WSCancelLabelTextCancelling]; 
     } 
     else { 
      cancelflag = NO; 
      [self.voiceRecorderView.recordButton setImage:[UIImage imageNamed:kWSPinkDotXLarge] forState:UIControlStateNormal]; 
      [self.voiceRecorderView setCancelText:WSCancelLabelTextStart]; 
     } 
    } 
    else if (gesture.state == UIGestureRecognizerStateEnded) { 

     [self stopRecording]; 

     if(!cancelflag) 
     { 
      [self sendRecording:self.recordingURL]; 
     } 
     else { 
      [self.voiceRecorderView setCancelText:WSCancelLabelTextCancelled]; 
     } 

     [self.voiceRecorderView resetView]; 
    } 
} 
1

Я надеюсь, что это будет работать для вас ....

BOOL cancelflag; 
UIButton *recordBtn; 
- (void)viewDidLoad 
    { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 
    UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPress:)]; 
    [longPress setDelegate:self]; 
    [recordBtn addGestureRecognizer:longPress]; 
    } 


-(void)handleLongPress:(UILongPressGestureRecognizer *)longPressRecognizer 
{ 

    if(longPressRecognizer.state == UIGestureRecognizerStateBegan) 
    { 
    if (!stopBtnFlag) 
    { 
     if (!audioRecorder.recording) 
     { 
      [self performSelectorOnMainThread:@selector(setUpAudioRecorder) withObject:nil waitUntilDone:YES]; 
      [audioRecorder record]; 
      NSLog(@"Recording..."); 

     } 
     stopBtnFlag = YES; 
     cancelflag =YES; 
    } 
} 
else if (longPressRecognizer.state == UIGestureRecognizerStateChanged) 
{ 
    [audioRecorder stop]; 
    stopBtnFlag = NO; 
    NSLog(@"moved"); 

} 
    else if (longPressRecognizer.state == UIGestureRecognizerStateEnded) 
    { 
    if(cancelflag) 
    { 
    [audioRecorder stop]; 
     [self playmusic]; 
    } 

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