【问题标题】:UIButton at bottom of screen only intermittently highlights屏幕底部的 UIButton 仅间歇性突出显示
【发布时间】:2013-10-05 18:48:58
【问题描述】:

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

这里报告了这个问题https://devforums.apple.com/message/865922

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

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

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

【问题讨论】:

  • 当用户点击按钮时,按钮有时不会突出显示? “控制中心”的手势识别器是什么意思。您是指按钮的内置手势识别器吗?
  • 我已经编辑了我的问题。当用户点击屏幕底部的按钮时,它只会间歇性地突出显示。这是由于为调出控制中心而保留的滑动手势阻止了突出显示。
  • 你试过用 button.selected = YES 设置 UIControlStateSelected 吗?
  • @FarhanHafeez,是的,我尝试过使用 UIControlStateSelected。没有骰子。问题与 UIButton 状态有关。事件触发但状态不会改变。很确定我需要构建一个看起来和功能都像按钮的组件才能绕过它。

标签: ios objective-c uibutton ios7


【解决方案1】:

我找到了一个非常简单的解决方法。使用 .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
}

【讨论】:

    【解决方案2】:

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

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

    viewDidLoad:

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

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

    - (BOOL)prefersStatusBarHidden {
        return YES;
    }
    

    希望这会有所帮助!

    【讨论】:

    • 这在技术上是一个解决方案,是的,但它需要通过隐藏状态栏和禁用后退手势来改变基本的用户体验。我的应用不适合隐藏状态栏或禁用返回手势。
    【解决方案3】:

    我已针对此问题发布了一个修复程序,该修复程序恢复了 question 中描述的亮点。通过子类化 UIButton 并覆盖 pointInside: 来捕获触摸事件来修复突出显示

    【讨论】:

    • 上述解决方案“设置高亮状态图像”似乎不错。但是,此评论中提到的线程中提供的解决方案似乎很完美。
    【解决方案4】:

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

    为了使整个按钮的反馈时间标准化,可以使用以下解决方案
    (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 可能在负延迟值的情况下表现良好,但比抱歉更安全

    【讨论】:

      猜你喜欢
      • 2019-05-08
      • 2021-01-10
      • 2021-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-09
      • 2016-06-02
      • 2011-08-10
      相关资源
      最近更新 更多