在我的应用程序中的某个时刻,我有一个突出显示的 UIButton
(例如,当用户将手指放在按钮上时)我需要在按钮突出显示时更改背景颜色(因此,当用户的手指仍在按钮上时) ) .
我尝试了以下方法:
_button.backgroundColor = [UIColor redColor];
但它没有用 . 颜色保持不变 . 当按钮没有突出显示时我尝试了相同的代码,它工作正常 . 我也尝试在改变颜色后调用 -setNeedsDisplay
,它没有任何效果 .
如何强制按钮更改背景颜色?
27 回答
你可以覆盖
UIButton
的setHighlighted
方法 .Objective-C
Swift 3.0 and Swift 4.1
斯威夫特3:
可以通过XIB设置它 . 在xib中设置突出显示的色调,同时点击按钮 . 因为直到现在还没有以编程方式正确的方法 . 因此,通过在XIB中设置它很容易 .
它会工作正常:)享受..
不确定这种解决方案是否解决了您的问题,或者是否符合您的一般开发前景,但我要尝试的第一件事就是更改touchDown事件上按钮的背景颜色 .
Option 1:
您需要捕获两个事件,当用户按下按钮时,UIControlEventTouchDown将用于捕获 . UIControlEventTouchUpInside和UIControlEventTouchUpOutside将在他们释放按钮时将其恢复到正常状态
Option 2:
返回由您想要的高光颜色制作的图像 . 这也可以是一个类别 .
然后更改按钮的突出显示状态:
无需将
highlighted
覆盖为计算属性 . 您可以使用属性观察器来触发背景颜色更改:Swift 4
在Swift中,您可以覆盖突出显示(或选定)属性的访问者,而不是覆盖setHighlighted方法
Swift中一个方便的通用扩展:
Swift 3.0
覆盖突出显示的变量 . 添加
@IBInspectable
可以让你在故事板中编辑突出显示的backgroundColor,这也很精彩 .更紧凑的解决方案(基于 @aleksejs-mjaliks 答案):
Swift 3/4+ :
斯威夫特2:
如果您不想覆盖,这是 @timur-bernikowich 的答案( Swift 4.2 )的更新版本:
使用 Swift 3+ 语法的UIButton扩展:
使用它像:
原答案:https://stackoverflow.com/a/30604658/3659227
您可以使用此类别添加方法 setBackgroundColor:forState:
https://github.com/damienromito/UIButton-setBackgroundColor-forState-
这是Swift中的一种方法,使用UIButton扩展来添加IBInspectable,名为highlightedBackgroundColor . 与子类化类似,不需要子类 .
我希望这有帮助 .
我没有子类化的最佳解决方案 Swift 3+ .
使用此扩展程序,可以轻松管理不同状态的颜色,如果未提供突出显示的颜色,它将自动淡化您的正常颜色 .
更新:
使用UIButtonBackgroundColor Swift库 .
旧:
使用下面的帮助程序创建一个带有灰度填充颜色的1 px x 1 px图像:
或RGB填充颜色:
然后,使用
image
设置按钮的背景图像:助手
注意:
ACU
是我的Cocoa Touch静态库的类前缀,名为Acani Utilities,其中AC用于Acani,U用于Utilities .试试这个 !!!!
对于TouchedDown事件集,一种颜色和TouchUpInside设置另一种颜色 .
对UIButton进行子类化并添加可检查的属性以方便使用(用Swift 3.0编写):
如果您有图像,请尝试此操作:
或者看看
showsTouchWhenHighlighted
是否足够你 .您可以继承UIButton并创建一个很好的forState .
colourButton.h
colourButton.m
Notes (这是一个例子,我知道有问题,这里有一些)
我已经使用NSMutableDictionay为每个状态存储UIColor,我必须为Key做一个令人讨厌的文本转换,因为UIControlState不是一个很好的直接Int . 如果你可以在那里使用那么多对象初始化一个数组并使用State作为索引 .
因此,许多人遇到困难,例如选中和禁用按钮,需要更多逻辑 .
另一个问题是,如果你尝试同时设置多种颜色,我没有试过按钮,但如果你能做到这一点,它可能无法正常工作
我假设这是StoryBoard,没有init,initWithFrame所以如果你需要它们就添加它们 .
我开源了一个UIButton子类,STAButton,填补这个有缺口的功能漏洞 . 可在MIT许可下使用 . 适用于iOS 7(我没有使用较旧的iOS版本进行测试) .
为了解决这个问题,我创建了一个类别来处理带有
UIButtons
的backgroundColor
状态:ButtonBackgroundColor-iOS
您可以将类别安装为pod .
易于使用 Objective-C
更容易使用 Swift :
我建议你导入pod:
使用use_frameworks!在你的Podfile中使用Swift和objective-C更容易使用你的pod .
IMPORTANT
I also wrote a Blog Post with more information.
使用https://github.com/swordray/UIButtonSetBackgroundColorForState
使用CocoaPods添加到Podfile
Swift
Objective-C
试试
tintColor
:以下是Swift中用于选择按钮状态的代码:
例:
把它放进去你很高兴:
*可以在IB中设置proerty,如果没有设置突出显示的背景,按下时背景不会改变
低于
UIIImage
扩展名将生成具有指定颜色参数的图像对象 .按钮的示例用法可以应用于按钮对象,如下所示:
如果你不会覆盖只设置两个动作touchDown touchUpInside