捕获UIControl外部的拖动 - UILongPressGestureRecognizer

时间:2014-11-15 20:30:13

标签: objective-c uigesturerecognizer

我正在尝试实施异步录音功能。有一个按钮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以告知用户是否拖出控件但仍在按下它?

2 个答案:

答案 0 :(得分: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];
    }

  }
}

答案 1 :(得分:1)

@Jaleel的回答给了我一个开始。这是一个完整的工作版本:

- (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];
    }
}