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

时间:2013-09-30 01:26:08

标签: ios objective-c uibutton ios7

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

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

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

如果不重新设计这些控件以显示在应用程序的其他位置,如何解决此问题?

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

4 个答案:

答案 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可以很好地处理负延迟值,但最好是安全而不是抱歉