ios - 当我点击 MPVolumeSlider 后,UIView 上的 UITapGestureRecognizer 被触发

标签 ios objective-c iphone uiview uitapgesturerecognizer

我在 stackoverflow 上找到了该问题的一些问题和答案,但那里的解决方案都没有解决我的问题。

我的 iOS 应用程序能够使用漂亮的音乐播放器播放一些音乐。我使用 Xcode 的 Interface Builder 进行设计,拖出一个 UIView 并将其类更改为 MPVolumeView。当我在 iPhone 6 上调试应用程序时,一切正常。

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

play/pause, next/previous track (...)

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

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

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

我的代码的函数,返回truefalse,具体取决于我点击的 View 。当我访问 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];
}

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

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

enter image description here

当我点击 View ( subview 除外)上的任意位置后, View 应该淡出并隐藏所有内容,只显示歌曲的艺术作品图像和当前耗时。这看起来像这样:

enter image description here

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

最佳答案

它的行为方式很简单,因为您将手势识别器添加到了整个 UIView 中,其中包括音量 slider 等。

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

创建一个 CGRect 属性,我将其命名为 touchArea:

@property CGRect touchArea;

然后指定touchArea的大小(您可以在viewDidLoad中执行此操作):

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

您必须找出您想要的位置以及它应该有多大,并将我的示例值替换为真实值。一种简单的欺骗方法是在 IB 中使用类似 UILabel 的东西,并根据您的需要对其进行定位和调整大小,然后转到尺寸检查器 Pane 并获取 x、y、宽度和高度值。

然后,在执行淡入淡出动画之前,检查触摸是否位于 touchArea 中:

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

作为注释,我会设置一个 BOOL 来检查 View 是否淡入或淡出,以便您始终可以在制作动画之前进行检查。

关于ios - 当我点击 MPVolumeSlider 后,UIView 上的 UITapGestureRecognizer 被触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28463919/

相关文章:

ios - 有没有办法知道何时在 Apple Pay View 中按下取消

ios - 如果按钮在 NSObject 中定义,则按钮 @selector 不起作用

objective-c - "Extra argument ' foo ' in call"或 "' [NSObject : AnyObject]! ' is not a subtype of ' Dictionary<Key, Value> '"

iphone - 我如何将 UIImage 堆叠在一起并在 UIKit 中摇摆不定

iphone - 在 UITableView 中,我可以有两个部分,每个部分的单元格长度可变吗?

iphone - 强制包含不导出任何符号的静态库对象文件 (GCC/iPhone)

android - React Native 中适用于 ios 和 Android 的自定义字体

ios - 使用放大镜更改位置后,UITextField 光标位置未定位到同一位置

ios - 在iOS 6中获取真实的Twitter用户名

iphone - 在应用程序运行时阻止 Iphone iOS 中的调用和短信