我的应用主视图底部有几个UIButton。当用户点击它们时,这些按钮会间歇性地突出显示,但总是会调用它们的目标方法。我发现它的控制中心的手势识别器妨碍了UIButton的突出显示。如果我将包含视图向上移动到屏幕中间,一切都按设计运行。
此处报告此问题https://devforums.apple.com/message/865922
作为一种解决方法,我尝试使用目标方法手动设置突出显示的状态。这似乎与允许UIButton正常突出显示具有相同的效果。
如果不重新设计这些控件以显示在应用程序的其他位置,如何解决此问题?
也许我使用标准视图并手动添加触摸交互的所有方法?我该怎么办?它甚至值得探索吗?
答案 0 :(得分:4)
我找到了一个非常简单的解决方法。使用.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
}
答案 1 :(得分:3)
我最近遇到了同样的问题,到处寻找答案。这对我有用。这是两件事的组合,UINavigationController
后滑动手势和iOS 7
控制中心手势(从屏幕底部向上滑动)。
如果在UINavigationController
:
viewDidLoad
中的:
if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
self.navigationController.interactivePopGestureRecognizer.enabled = NO;
}
将控制中心手势设置为仅显示向上箭头,而不是首先显示控制中心。您可以通过覆盖以下UIViewController方法来完成此操作:
- (BOOL)prefersStatusBarHidden {
return YES;
}
希望这有帮助!
答案 2 :(得分:1)
我已针对此问题发布了修复程序,该修复程序带来了此question中描述的突出显示。通过继承UIButton并覆盖pointInside:来捕捉触摸事件
来修复突出显示答案 3 :(得分:0)
如果你有一个覆盖整个屏幕底部的按钮,你可能会遇到只有左边部分出现这种延迟的问题。
为了规范整个按钮的反馈时间,可以使用以下解决方案 (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可以很好地处理负延迟值,但最好是安全而不是抱歉