如何在自定义UIButton中实现.isHighlighted动画效果?
我来给你分享一个完整的实现方案,刚好匹配你描述的需求——替换默认的高亮和选中行为,让高亮时显示描边,同时自定义选中状态的样式(不再是默认的蓝色背景):
首先,我们可以通过重写UIButton的setHighlighted(_:)和setSelected(_:)方法,结合图层动画来实现平滑的状态切换效果。下面是完整的自定义Button类代码:
import UIKit class CustomOutlineButton: UIButton { // 可根据需求自定义颜色和边框宽度 private let highlightBorderColor = UIColor.systemBlue.cgColor private let selectedBorderColor = UIColor.systemGreen.cgColor // 选中状态用不同颜色区分 private let borderWidth: CGFloat = 2.0 override init(frame: CGRect) { super.init(frame: frame) setupBaseStyle() } required init?(coder: NSCoder) { super.init(coder: coder) setupBaseStyle() } private func setupBaseStyle() { // 清除系统默认的高亮/选中背景样式 adjustsImageWhenHighlighted = false adjustsImageWhenDisabled = false setBackgroundImage(nil, for: .highlighted) setBackgroundImage(nil, for: .selected) setBackgroundImage(nil, for: [.selected, .highlighted]) // 初始化边框为透明,添加圆角(可选) layer.borderColor = UIColor.clear.cgColor layer.borderWidth = borderWidth layer.cornerRadius = 8.0 clipsToBounds = true } override func setHighlighted(_ highlighted: Bool) { super.setHighlighted(highlighted) // 高亮状态的平滑动画 UIView.animate(withDuration: 0.15) { if highlighted { self.layer.borderColor = self.highlightBorderColor } else { // 如果按钮处于选中状态,高亮结束后保持选中的边框颜色 self.layer.borderColor = self.isSelected ? self.selectedBorderColor : UIColor.clear.cgColor } } } override func setSelected(_ selected: Bool) { super.setSelected(selected) // 选中状态的平滑动画 UIView.animate(withDuration: 0.15) { if selected { self.layer.borderColor = self.selectedBorderColor } else { // 如果按钮正在被高亮,取消选中后保持高亮的边框颜色 self.layer.borderColor = self.isHighlighted ? self.highlightBorderColor : UIColor.clear.cgColor } } } }
关键细节说明:
- 清除默认样式:在
setupBaseStyle里取消了系统自带的高亮/选中背景图,避免默认的蓝色背景干扰自定义效果。 - 状态联动处理:高亮和选中状态做了联动判断——比如当按钮处于选中状态时,手指触碰(高亮)后离开,不会隐藏边框,而是保持选中的颜色;同理,选中按钮时如果手指还没离开,会先保持高亮颜色,直到手指松开。
- 自定义扩展:如果想要选中状态和高亮状态的描边完全一致,只需要把
selectedBorderColor改成和highlightBorderColor相同的值就行;要是还需要修改文字颜色,直接在setSelected(_:)里添加self.setTitleColor(yourColor, for: .selected)即可。
内容的提问来源于stack exchange,提问作者Nerdy Bunz
相关产品推荐
相关产品推荐

