【问题标题】:Automatically disable UIButton with type custom when a UIAlertController covers the screen当 UIAlertController 覆盖屏幕时自动禁用自定义类型的 UIButton
【发布时间】:2016-10-12 11:16:39
【问题描述】:

我有一个UIViewController,其中包含多个UIButton 类型为custom。如果我的视图失去焦点,例如出现新的视图控制器或在其上添加了其他视图,我如何自动灰显(禁用)我的自定义按钮?

基本上我想将无法接收触摸的按钮变灰,因此用户的焦点仅在屏幕上的交互式元素上。

我没有在系统中使用按钮类型,因为我想为按钮图像设置非单色图像。

【问题讨论】:

  • 请出示一些代码或截图。
  • 除非您正在寻找其他类型的解决方案,否则您应该能够在显示警报之前将按钮设置为 button.userInteractionEnabled = false
  • 重叠的viewController将整个背景变灰还不够吗?
  • 试试这个按钮。isEnabled = false
  • @zisoft 是的。但是对于我在顶部创建和添加子视图的情况,这会使下面的视图无响应,我不希望这些按钮给人一种可点击的印象。

标签: ios objective-c swift uibutton


【解决方案1】:

UIAlertController 出现时,这会改变窗口的色调。这就是非自定义按钮变暗的原因。这些正常和暗淡的颜色取自tintColor 属性。如果是自定义按钮,您可以覆盖 tintColorDidChange 方法:

class CustomButton: UIButton {

    override func tintColorDidChange() {
        if tintAdjustmentMode == .dimmed {
            // modify subviews to look disabled
        } else {
            // modify subviews to look enabled
        }   
    }

}

但在您的情况下,您的图像看起来只有一种颜色。这就是为什么你可以让它变得更简单。只需使用渲染模式UIImageRenderingMode.alwaysTemplate 加载按钮的图像并将按钮的tintColor 更改为等于图像的颜色。然后一切都会自动发生。

借助 Xcode 可以在模板模式下渲染图像

或以编程方式从原始图像中获取originalImage.withRenderingMode(.alwaysTemplate)

【讨论】:

  • 感谢您的提示:当 UIAlertController 出现时,会改变窗口的色调。这有帮助。
【解决方案2】:

您可以使用以下代码。

NSArray *subviews = [self.view subviews];
for (UIView *v in subviews) {
    if ([v isKindOfClass:[UIButton class]]) 
    {
        UIButton *button = (UIButton *) v;
        [button setEnabled:NO];
        [button setAlpha:0.5];
    }
}

此代码将禁用当前视图中的所有 UIButton。当 Alertview 关闭时,您可以重新启用按钮。

希望这会有所帮助!

【讨论】:

    【解决方案3】:

    如果您希望按钮不可触摸,您可以使用

    button.enabled = false ; button.userInteractionEnabled = false

    在展示你的 UIAlertViewController 和

    之前

    button.enabled = true ; button.userInteractionEnabled = true

    呈现 UIAlertViewController 之后

    如果你想改变按钮的颜色,你可以使用

        [btn setBackgroundImage:[UIImage imageNamed:@"your gray image"] forState:UIControlStateSelected];
    

    [btn setBackgroundImage:[UIImage imageNamed:@"your gray image"] forState:UIControlStateHighlighted];

    根据你的选择

    【讨论】:

    • 我必须为屏幕中的每个自定义按钮以及我的视图变得无响应的每种情况执行此操作,并且为了保持它的一致性,我必须在我要编码的每个视图控制器中执行此操作。我在这里寻找更多通用解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多