You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在自定义UIButton中实现.isHighlighted动画效果?

自定义UIButton实现高亮描边与选中状态自定义效果

我来给你分享一个完整的实现方案,刚好匹配你描述的需求——替换默认的高亮和选中行为,让高亮时显示描边,同时自定义选中状态的样式(不再是默认的蓝色背景):

首先,我们可以通过重写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:21:10