屏幕底部的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可以很好地处理负延迟值,但是比抱歉更安全
- 如何抑制Xcode中的警告?
- Xcode工作区 – 没有从框架项目窗格中find导入
- iOS:如何获得后台线程来重绘主线程上的视图
- 如何使用AFNetworking AFHTTPRequestOperationManager显示ProgressBar
- Xcode 5归档生成失败,但正常build立成功
- 从CloudKit获取CKAsset图像非常慢
- 如何创build从UIViewController到UISplitViewController的segue
- '无法在descriptionForLayoutAttribute_layoutItem_coefficient中创build描述。 有些东西是零“
- 从UIView加载一个UINavigation控制器