使带有 imageView 的 UIButton 看起来被禁用而不将 isEnabled 设置为 false
Posted
技术标签:
【中文标题】使带有 imageView 的 UIButton 看起来被禁用而不将 isEnabled 设置为 false【英文标题】:Making a UIButton with an imageView look disabled without setting isEnabled to false 【发布时间】:2018-03-02 06:01:30 【问题描述】:我有一些 UIButtons 我通过设置 button.isEnabled = false 来禁用。我发现当按钮被禁用时,我仍然需要能够访问它们。所以,我需要让按钮保持启用状态,但让它们看起来被禁用。这应该可以通过更改按钮的图像/文本的颜色来实现。这些按钮有一个 imageView 可以改变 isEnabled 和 isHighlighted 的颜色。如果我停止设置 isEnabled,则 imageView 不再更改。作为一个实验,我在 button.titleLabel 中添加了文本,我可以在按钮上看到 imageView 和 titleLabel。我可以设置 button.titleLabel.isEnabled = false 并看到 titleLabel 变为灰色,但 imageView 保持亮起。我还没有为 imageView 找到等效于 isEnabled 的方法。我已经尝试过改变 imageView 颜色的方法,但 UIButton 似乎确定只有它应该改变图像颜色,并且只有在设置了 button.isEnabled 时。有没有办法以编程方式改变图像颜色?
我已经检查了所有建议的问题,但它们都设置为 isEnabled。
【问题讨论】:
您可以将按钮的 alpha 值更改为禁用 当前的用法,我使用isEnabled的地方,只是将按钮中的图像变灰。我想复制这个功能。我尝试更改 imageView.alpha 但没有效果。 【参考方案1】:设置按钮的titleColor和titleImage为正常状态,使按钮看起来被禁用但不是被禁用...
“fakeIsEnabled”没有方便的方法,所以你必须手动完成
【讨论】:
Daij-Djan,感谢您的输入。你的意思是 setTitleColor(UIColor,for:.normal) 和 image(UIImage:for:.normal) 但这需要我在我的 xcassetts 中创建单独的图像。但是,您可能的评论和确认让我今天早上再看一遍,我发现了问题。所以很有帮助。【参考方案2】:似乎问题在于,在我的 xcassetts 中,我将图像的“渲染为”设置为默认值。如果我强迫它使用“原始图像”,我现在遇到了同样的问题。为什么设置 button.isEnabled = false 工作尚不清楚,但可能是苹果太聪明了一半。如果我将它设置为“模板图像”,那么我可以影响 button.imageView.tintColor。我通过以编程方式加载图像知道这一点。
所以,步骤是:
-
确保图像在 xCassetts 中设置为模板。
在 IB 中或以编程方式设置初始 tintColor:
button?.imageView?.tintColor = UIColor.white
那么在代码中根据一个布尔值改变颜色的值是:
button?.imageView?.tintColor = value ? UIColor.white : UIColor.white.withAlphaComponent(0.5)
我还发现我可以使用 tintAdjustmentMode 使用代码:
`button?.imageView?.tintAdjustmentMode = value ? .normal : .dimmed`
它会使图像变暗,可能与 button.isEnabled = false 一样。我发现我更喜欢 0.5 的 alpha,因为它更明显。
【讨论】:
以上是关于使带有 imageView 的 UIButton 看起来被禁用而不将 isEnabled 设置为 false的主要内容,如果未能解决你的问题,请参考以下文章
根据状态更改 UIButton 中 ImageView 的 tint 颜色
UIButton ImageView 在 iCarousel 中占用更多空间并且不响应触摸事件