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
чтобы проверить, исчезает или нет вид, так что вы всегда можете проверить перед анимацией.