UITapGestureRecognizer в UIView срабатывает после того, как я нажимаю на свой MPVolumeSlider

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

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

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

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

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

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

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

в мой код, который возвращает true или false, в зависимости от того, какое представление я нажимаю. Когда я обращаюсь к свойству gestureRecognizer.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];
}

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

EDIT: мой музыкальный проигрыватель выглядит так:

введите здесь описание изображения

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

введите здесь описание изображения

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


person beeef    schedule 11.02.2015    source источник
comment
Вы не против опубликовать свой код? Все, что имеет значение, будет работать. Вы бы тоже выложили фото своей раскадровки...   -  person CaptJak    schedule 11.02.2015
comment
Хорошо, только минутку, пожалуйста, я меняю свой вопрос.   -  person beeef    schedule 11.02.2015
comment
Только что отредактировал мой вопрос, надеюсь, вы понимаете, что я имею в виду.   -  person beeef    schedule 12.02.2015
comment
Я полностью понимаю вашу проблему. Единственная причина, по которой я прошу код, заключается в том, что может быть несколько исправлений, а причина проблемы не совсем ясна. Если бы вы могли сделать снимок экрана вашего viewController в своей раскадровке и опубликовать любой код, который вы написали для этого viewController, я могу помочь больше.   -  person CaptJak    schedule 12.02.2015
comment
У меня не так много кода для размещения здесь, я разработал весь свой интерфейс с помощью Interface Builder, перетащил TapGestureRecognizer в свой UIView (который содержит все мои элементы управления) и добавил свой метод делегата. Там нет кода, кроме тех строк, которые я уже разместил. Или что именно вы хотите увидеть?   -  person beeef    schedule 12.02.2015
comment
У вас получилось?   -  person CaptJak    schedule 16.02.2015
comment
Да, но я думаю, что с использованием грязного обходного пути.   -  person beeef    schedule 16.02.2015
comment
Вы должны опубликовать его, а затем принять свой собственный ответ.   -  person CaptJak    schedule 16.02.2015


Ответы (1)


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

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

Создайте свойство CGRect, я назову его touchArea:

@property CGRect touchArea;

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

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

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

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

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

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

person CaptJak    schedule 11.02.2015