菜鸟教程小白 发表于 2022-12-12 14:18:55

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


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

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

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

<blockquote>
<p>play/pause, next/previous track (...)</p>
</blockquote>

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

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

<pre><code>- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    NSLog(@&#34;tapped&#34;);
    if(]) {
      return true;
    }
    return false;
}
</code></pre>

<p>函数到我的代码,它返回 <em>true</em> 或 <em>false</em>,具体取决于我正在点击的 View 。当我访问 <em>gestureRecognizer.view</em> 属性时,它无法识别我的 MPVolumeView,只能识别后台的 UIView。</p>

<p>这是我在 <code>TapGestureRecognizers</code> 被触发后触发的两个方法:</p>

<pre><code>- (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];
}
</code></pre>

<p>请帮帮我,我快要疯了..</p>

<p><strong>编辑</strong>:我的音乐播放器如下所示:</p>

<p> <img src="/image/XzOER.png" alt="enter image description here"/> </p>

<p>点击 View 上的<strong>anywhere</strong>( subview 除外)后, View 应该淡出并隐藏所有内容,只显示歌曲的原图图像和当前耗时。这将如下所示:</p>

<p> <img src="/image/MfDpr.png" alt="enter image description here"/> </p>

<p>正如我所说 - 问题是,如果我只是点击音量 slider 或将其滑动一点点,我的 <code>UITapGestureRecognizer</code> 会触发并淡出我的完整 View 。我怎样才能防止这种情况发生?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>它的行为方式仅仅是因为您将手势识别器添加到了整个 <code>UIView</code>,其中包括音量 slider 等。 </p>

<p>不是在整个 View 中检测触摸,而是检查触摸是否在您想要的区域中。</p>

<p>创建一个<code>CGRect</code>属性,我称之为<code>touchArea</code>:</p>

<pre><code>@property CGRect touchArea;
</code></pre>

<p>然后指定<code>touchArea</code>的大小(你可以在<code>viewDidLoad</code>中做到这一点):</p>

<pre><code>touchArea= CGRectMake(0.0, 240.0, 320.0, 240.0);
</code></pre>

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

<p>然后,在你做淡入淡出动画之前,检查触摸是否在 <code>touchArea</code>:</p>

<pre><code>- (void)handleGesture:(UIGestureRecognizer *)gestureRecognizer
{
    CGPoint touchPoint = ;
    if (CGRectContainsPoint(touchArea, touchPoint))
    {
      //do your animation here.
    }
}
</code></pre>

<p>作为说明,我会设置一个 <code>BOOL</code> 来检查 View 是淡入还是淡出,因此您可以在制作动画之前随时检查。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 在我点击我的 MPVolumeSlider 后,UIView 上的 UITapGestureRecognizer 被触发,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/28463919/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/28463919/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 在我点击我的 MPVolumeSlider 后,UIView 上的 UITapGestureRecognizer 被触发