UITapGestureRecognizer на UIView запускается после нажатия на мой MPVolumeSlider

Здесь я нашел несколько вопросов и ответов по stackru для этой проблемы, но ни одно из решений там не решило мою проблему.

В моем приложении для iOS есть возможность проигрывать музыку с помощью приятного музыкального проигрывателя. Я разработал его с помощью Xcode Interface Builder и вытащил UIView и изменил свой класс на MPVolumeView, Все отлично работает, когда я отлаживаю свое приложение на iPhone 6.

Вот моя проблема: я также вытащил UITapGestureRecognizer на весь мой взгляд, который содержит мои элементы управления, такие как

воспроизведение / пауза, следующий / предыдущий трек (...)

а также мой MPVolumeView, Когда я нажимаю на это представление, оно должно исчезнуть и исчезнуть. Затем я добавил UITapGestureRecognizer на моем UIImageView который показывает мое художественное изображение песни. Когда я нажимаю на это изображение, оно должно исчезать в моем представлении со всеми элементами управления в int - это работает правильно.

НО: когда я немного сдвигаю ручку регулятора громкости, или если я просто прикасаюсь к ней, изображение все равно исчезает. Похоже мой MPVolumeView пересылает мое прикосновение или что-то в этом роде. Я пробовал настройку userInteractionEnabled = false на моем слайдере громкости, но это не помогло. Я также установил для себя делегата моего распознавателя жестов и добавил

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    NSLog(@"tapped");
    if([gestureRecognizer.view isMemberOfClass:[UIImageView class]]) {
        return true;
    }
    return false;
}

функция моего кода, которая возвращает истину или ложь, в зависимости от того, какое представление я касаюсь. Когда я обращаюсь к свойству gestRecognizer.view, он не распознает мой MPVolumeView, только UIView на заднем плане.

Вот мои два метода, которые запускаются после того, как TapGestureRecognizers уволены:

- (IBAction)overlayViewTapped:(UITapGestureRecognizer *)sender {
    if(sender.state == UIGestureRecognizerStateEnded) {
        [UIView animateWithDuration:0.3
                          delay:0.0
                        options:UIViewAnimationOptionAllowUserInteraction
                     animations:^{ self.blackOverlayView.alpha = 0.0; self.normalTimeLabel.alpha = 1.0; }
                     completion:nil];
    }
}
- (IBAction)imageViewTapped:(UITapGestureRecognizer *)sender {
    [UIView animateWithDuration:0.3
                      delay:0.0
                    options:UIViewAnimationOptionAllowUserInteraction
                 animations:^{ self.blackOverlayView.alpha = 1.0; self.normalTimeLabel.alpha = 0.0; }
                 completion:nil];
}

Пожалуйста, помогите мне, я почти схожу с ума с этим..

РЕДАКТИРОВАТЬ: Мой музыкальный проигрыватель выглядит так:

После того, как я коснусь любого места в представлении (кроме подпредставлений), представление должно исчезнуть и скрыть все, просто показать изображение обложки песни и текущее прошедшее время. Это будет выглядеть так:

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

1 ответ

Он ведет себя так, как будто просто добавил распознаватель жестов ко всему UIView, который включает в себя слайдер громкости и еще много чего.

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

Создать CGRect собственность, я назову это touchArea:

@property CGRect touchArea;

Затем укажите размер touchArea (вы можете сделать это в viewDidLoad):

touchArea  = CGRectMake(0.0, 240.0, 320.0, 240.0);

Вам нужно будет выяснить, где вы хотите это и насколько оно должно быть большим, и заменить значения в моем примере реальными. Простой способ обмануть это взять что-то вроде UILabel в IB и позиционируем и определяем его размер по вашему желанию, затем перейдите на панель инспектора размера и получите значения x, y, width и height.

Затем, прежде чем выполнять анимацию затухания, проверьте, было ли касание в touchArea:

- (void)handleGesture:(UIGestureRecognizer *)gestureRecognizer 
{
    CGPoint touchPoint = [gestureRecognizer locationInView:self.view];
    if (CGRectContainsPoint(touchArea, touchPoint)) 
    {
        //do your animation here.
    } 
}

Как примечание, я бы установил BOOL чтобы проверить, исчезает или нет вид, так что вы всегда можете проверить перед анимацией.

Другие вопросы по тегам