屏幕底部的UIButton只是间歇性地突出显示

我的应用程序主视图底部有一些UIButton。 当用户点击它们时,这些按钮间歇性地不会突出显示,但总是会调用它们的目标方法。 我发现它的控制中心的手势识别器妨碍了UIButton的突出显示。 如果我将包含视图向上移动到屏幕中间,则一切都按设计运行。

该问题在此处报告https://devforums.apple.com/message/865922

作为一种解决方法,我尝试使用目标方法手动设置突出显示的状态。 这似乎与允许UIButton正常突出显示具有相同的效果。

任何想法如何解决这个问题,而无需重新设计这些控件以显示在应用程序的其他位置?

也许我使用标准视图并手动添加所有触摸交互方法? 我该怎么办? 它甚至值得探索吗?

我找到了一个非常简单的解决方法。 使用.highlighted = YES和.selected = YES等标准属性似乎不适用于该底部波段。 我没有设置突出显示的状态,而是在调用最终方法之前,将按钮的背景图像设置为突出显示的状态,并带有未感知的延迟。

[self.stopRecordingButton setImage:[UIImage imageNamed:@"stopRecordingButton"] forState:UIControlStateNormal]; [self.stopRecordingButton setImage:[UIImage imageNamed:@"stopRecordingButton-highlighted"] forState:UIControlStateHighlighted]; [self.stopRecordingButton addTarget:self action:@selector(stopRecordingDelay) forControlEvents:UIControlEventTouchUpInside]; -(void)stopRecordingDelay { [self.stopRecordingButton setImage:[UIImage imageNamed:@"stopRecordingButton-highlighted"] forState:UIControlStateNormal]; [self performSelector:@selector(stopRecording) withObject:nil afterDelay:0.025f]; } - (void)stopRecording { [self.stopRecordingButton setImage:[UIImage imageNamed:@"stopRecordingButton"] forState:UIControlStateNormal]; //Do real stuff } 

我最近遇到了同样的问题,到处寻找答案。 这对我有用。 这是两件事的组合, UINavigationController后滑动手势和iOS 7控制中心手势(从屏幕底部向上滑动)。

如果在UINavigationController上禁用后滑动手势:

viewDidLoad

 if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) { self.navigationController.interactivePopGestureRecognizer.enabled = NO; } 

将控制中心手势设置为仅显示向上箭头,而不是首先显示控制中心。 您可以通过重写以下UIViewController方法来完成此操作:

 - (BOOL)prefersStatusBarHidden { return YES; } 

希望这可以帮助!

我已经发布了针对此问题的修复程序,该问题带来了此问题中描述的重点。 通过子类化UIButton并重写pointInside来修复突出显示:捕获触摸事件

如果您有一个覆盖屏幕整个底部的按钮,则可能会遇到只有左侧部分有此延迟的问题。

为了标准化整个按钮的反馈时间,可以使用以下解决方案
(Aaron Shekey的改进版):

 NSDate *touchDownTime; - (void)touchDown { self.alpha = 0.7; touchDownTime = [NSDate date]; } - (void)touchUpInside { // basically at least 80ms feedback is guaranteed this way // note: timeIntervalSinceNow returns negative NSTimeInterval feedbackTimeLeftToShow = MAX(0.08 + [touchDownTime timeIntervalSinceNow], 0.001); [self performSelector:@selector(touchUpInsideAfterFeedback) withObject:nil afterDelay:feedbackTimeLeftToShow]; } - (void)touchUpInsideAfterFeedback { self.alpha = 1; } 

注意:performSelector可以很好地处理负延迟值,但是比抱歉更安全