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

时间:2018-04-24 04:24:52

标签: ios xcode animation uibutton highlight

序言(在实际问题的代码后向下翻页):

我有一个自定义UIButton类,我用这种行为替换了普通的UIButton isHighlighted动画行为:

当用户的手指实际上在按钮上时(即突出显示按钮),按钮周围将出现描边轮廓(方形边框)。当他们不再触摸按钮时,轮廓消失。

此外,我已将此正常isSelected行为(背景变为蓝色)替换为:

绘制了与isHighlighted使用的大纲相同的大纲,除了它稍微厚一点,并且始终只有isSelected = true,并且在isSelected = false时不存在。

这是有效的,这就是我做的方式:

import UIKit

class CustomButton: UIButton {

    // BUTTON TYPES:
    // Gorsh, enums sure would be swell here. :T
    // 1 : plus
    // 2 : minus
    // 3 : etc etc....
    @IBInspectable
    var thisButtonsType: Int = 1 { didSet { setNeedsDisplay() } }

    @IBInspectable
    var fillColor: UIColor = .black { didSet { setNeedsDisplay() } }

    @IBInspectable
    var strokeColor: UIColor = .black { didSet { setNeedsDisplay() } }

    override var isHighlighted: Bool {
        didSet {
            setNeedsDisplay()
        }
    }

    override func draw(_ rect: CGRect) {

        let unitOfMeasure = bounds.width / 5

        // draw outline in case we are selected / highlighted
        if (isSelected || isHighlighted) {

            let tempPath = BezierPathFactory.outline(totalWidth: bounds.width)
            if (isSelected) {tempPath.lineWidth = 4.0}
            strokeColor.setStroke()
            tempPath.stroke()

        }

        // initialize path object
        var path = UIBezierPath()

        // get the path corresponding to our button type
        switch thisButtonsType {

        case 1:
            path = BezierPathFactory.plus(gridSpacing: unitOfMeasure)
        case 2:
            path = BezierPathFactory.minus(gridSpacing: unitOfMeasure)

        default: print("hewo!")

        }

        fillColor.setFill()

        path.fill()


    }

}

再一次,该代码可以工作但是......

我真正想要的是,如果那是突出的边框轮廓会在触摸完成后逐渐消失。

注意:如果你想知道为什么我会用这种方式做事......我打算实施许多不同的按钮类型......所有这些都有“打印”不同的图标......但是我想要它们全部遵循这些基本行为。其中只有几个是“切换”按钮,这些按钮会被选中,因此可以使用突出显示淡入淡出。

我已经知道如何制作动画......但它只是在努力思考如何在这种情况下做到这一点。

我希望我能获得UIButton源代码。

有没有一种方法可以在不完全改变设计模式的情况下,相对简单地将淡入淡出动画添加到上面的代码中?我是否必须开始使用像图层这样的核心图形的其他功能?

谢谢!

1 个答案:

答案 0 :(得分:1)

您可以执行以下操作:

  1. 创建UIButton的子类,为子按钮添加和管理类CAShapeLayer的子图层。
  2. 将轮廓线轮廓绘制到形状图层中。
  3. 确保图层使用视图调整大小:覆盖视图的layoutSubviews,以便更新图层的框架并更新轮廓的路径。
  4. 您应该观察或覆盖state UIControl的{​​{1}}属性(UIButton的祖先),以注意状态的变化。
  5. 使用属性动画(CABasicAnimation)表示形状图层的不透明度,以淡入淡出轮廓。