我在 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 ,但这没有帮助。我还将手势识别器的代表设置为 self 并添加了
- (BOOL)gestureRecognizerUIGestureRecognizer *)gestureRecognizer shouldReceiveTouchUITouch *)touch {
NSLog(@"tapped");
if([gestureRecognizer.view isMemberOfClass:[UIImageView class]]) {
return true;
}
return false;
}
函数到我的代码,它返回 true 或 false,具体取决于我正在点击的 View 。当我访问 gestureRecognizer.view 属性时,它无法识别我的 MPVolumeView,只能识别后台的 UIView。
这是我在 TapGestureRecognizers 被触发后触发的两个方法:
- (IBAction)overlayViewTappedUITapGestureRecognizer *)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)imageViewTappedUITapGestureRecognizer *)sender {
[UIView animateWithDuration:0.3
delay:0.0
options:UIViewAnimationOptionAllowUserInteraction
animations:^{ self.blackOverlayView.alpha = 1.0; self.normalTimeLabel.alpha = 0.0; }
completion:nil];
}
请帮帮我,我快要疯了..
编辑:我的音乐播放器如下所示:
点击 View 上的anywhere( subview 除外)后, View 应该淡出并隐藏所有内容,只显示歌曲的原图图像和当前耗时。这将如下所示:
正如我所说 - 问题是,如果我只是点击音量 slider 或将其滑动一点点,我的 UITapGestureRecognizer 会触发并淡出我的完整 View 。我怎样才能防止这种情况发生?
Best Answer-推荐答案 strong>
它的行为方式仅仅是因为您将手势识别器添加到了整个 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)handleGestureUIGestureRecognizer *)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/
|