在我点击我的 MPVolumeSlider 后,UIView 上的 UITapGestureRecognizer 被触发

Posted

技术标签:

【中文标题】在我点击我的 MPVolumeSlider 后,UIView 上的 UITapGestureRecognizer 被触发【英文标题】:UITapGestureRecognizer on UIView gets fired after I tap on my MPVolumeSlider 【发布时间】:2015-02-11 20:31:39 【问题描述】:

我在 *** 上找到了一些关于该问题的问题和答案,但没有一个解决方案能解决我的问题。

我的 ios 应用程序可以通过一个不错的音乐播放器播放一些音乐。我用 Xcode 的 Interface Builder 设计了它,并拖出一个 UIView 并将其类更改为 MPVolumeView。当我在 iPhone 6 上调试我的应用程序时,一切正常。

这是我的问题:我还在整个视图中拖出了一个 UITapGestureRecognizer,其中包含我的控件,例如

播放/暂停、下一首/上一首曲目 (...)

还有我的MPVolumeView。当我点击该视图时,它应该淡出并消失。然后我在我的UIImageView 上添加了一个UITapGestureRecognizer,它显示了我对这首歌的艺术形象。当我点击这个图像视图时,它应该在我的视图中淡出,所有控件都在 int 中 - 这工作正常。

但是:当我稍微滑动音量滑块的旋钮时,或者如果我只是触摸它,视图仍然会消失。似乎我的MPVolumeView 正在转发我的触摸或类似的东西。我尝试在音量滑块上设置userInteractionEnabled = false,但这并没有帮助。我还将手势识别器的代表设置为 self 并添加了

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

函数到我的代码,它返回 truefalse,具体取决于我正在点击的视图。当我访问 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];

请帮帮我,我快要疯了..

编辑:我的音乐播放器如下所示:

点击视图上的anywhere后(除了子视图),视图应该淡出并隐藏所有内容,只显示歌曲的原图图像和当前经过的时间。这将如下所示:

正如我所说 - 问题是,如果我只是点击音量滑块或将其滑动一点点,我的 UITapGestureRecognizer 会触发并淡出我的完整视图。我怎样才能防止这种情况发生?

【问题讨论】:

您介意发布您的代码吗?任何相关的东西都会起作用。您也可以发布故事板的图片... 请稍等,我正在改变我的问题。 刚刚编辑了我的问题,希望你明白我的意思。 我完全理解您的问题。我要求代码的唯一原因是因为可能有几个更正并且问题的原因并不完全清楚。如果您可以在情节提要中截取 viewController 的屏幕截图,并发布您为此 viewController 编写的任何代码,我可以提供更多帮助。 我没有太多代码可以在这里发布,我使用 Interface Builder 设计了我的整个界面,将 TapGestureRecognizer 拖到我的 UIView(其中包含我的所有控件)上,并添加了我的委托方法。除了我已经发布的行之外,没有代码。或者你到底想看什么? 【参考方案1】:

它的行为方式仅仅是因为您将手势识别器添加到了整个 UIView,其中包括音量滑块等。

不是在整个视图中检测触摸,而是检查触摸是否在您想要的区域中。

创建一个CGRect 属性,我称之为touchArea

@property CGRect touchArea;

然后指定touchArea的大小(你可以在viewDidLoad中这样做):

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

您必须找出您想要的位置以及它应该有多大,并将我的示例值替换为真实值。一个简单的作弊方法是在 IB 中获取类似 UILabel 的内容并根据您的需要定位和调整大小,然后转到大小检查器窗格并获取 x、y、宽度和高度值。

然后,在你做淡入淡出动画之前,检查触摸是否在touchArea

- (void)handleGesture:(UIGestureRecognizer *)gestureRecognizer 

    CGPoint touchPoint = [gestureRecognizer locationInView:self.view];
    if (CGRectContainsPoint(touchArea, touchPoint)) 
    
        //do your animation here.
     

作为说明,我会设置一个BOOL 来检查视图是淡入还是淡出,因此您可以在制作动画之前随时进行检查。

【讨论】:

以上是关于在我点击我的 MPVolumeSlider 后,UIView 上的 UITapGestureRecognizer 被触发的主要内容,如果未能解决你的问题,请参考以下文章

我的电脑是win10的开机后一输入密码就黑屏了?

u盘被占用,无法弹出解决办法

为啥我的优盘插在我的电脑上无反应呀!

我的电脑插入U盘后为啥没有反应?

linux下USB识别不了……急急急……

如何避免Android键盘在我点击输入后自动关闭?