序言(在实际问题的代码后向下翻页):
我有一个自定义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源代码。
有没有一种方法可以在不完全改变设计模式的情况下,相对简单地将淡入淡出动画添加到上面的代码中?我是否必须开始使用像图层这样的核心图形的其他功能?
谢谢!
答案 0 :(得分:1)
您可以执行以下操作:
UIButton
的子类,为子按钮添加和管理类CAShapeLayer
的子图层。layoutSubviews
,以便更新图层的框架并更新轮廓的路径。state
UIControl
的{{1}}属性(UIButton
的祖先),以注意状态的变化。 CABasicAnimation
)表示形状图层的不透明度,以淡入淡出轮廓。