12

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

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

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

任何想法如何在不重新设计这些控件以显示在应用程序的其他位置的情况下解决此问题?

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

4

4 回答 4

5

我找到了一个非常简单的解决方法。使用 .highlighted = YES 和 .selected = YES 等标准属性似乎在该底部范围内不起作用。在调用 final 方法之前,我没有设置高亮状态,而是将按钮的背景图像设置为高亮状态,并有一个无法察觉的延迟。

[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
}
于 2013-12-26T06:13:01.980 回答
3

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

如果在 a 上,则禁用向后滑动手势UINavigationController

viewDidLoad

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

将控制中心手势设置为仅显示向上箭头,而不是首先显示控制中心。您可以通过覆盖以下 UIViewController 方法来做到这一点:

- (BOOL)prefersStatusBarHidden {
    return YES;
}

希望这可以帮助!

于 2014-01-27T19:06:13.380 回答
2

我已经针对这个问题发布了一个修复程序,它使这个问题中描述的亮点回归。通过继承 UIButton 并覆盖 pointInside: 来捕获触摸事件来修复突出显示

于 2014-05-21T15:10:13.910 回答
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 可能在负延迟值下表现良好,但安全总比抱歉好

于 2016-02-11T12:49:51.387 回答