ios - 如何快速动画边框闪烁?
解决方案
这是我的解决方案:
- 为基础视图使用动画渐变层
- 添加一个覆盖的白色视图(带插图)以覆盖渐变的中心
- 正如MadProgrammer 所说,您可以设置渐变的
startPoint
和endPoint
一个角度,让它绕过角落
class BorderShimmerView : UIView {
/// allow gradient layer to resize automatically
override class var layerClass: AnyClass { return CAGradientLayer.self }
/// boilerplate UIView initializers
init() {
super.init(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
commonInit()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
commonInit()
}
/// set up everything
func commonInit() {
let overlayView = UIView() /// add a view overlaid on the gradient view
overlayView.backgroundColor = .white
overlayView.frame = bounds.insetBy(dx: 3, dy: 3) /// appears like a border
overlayView.autoresizingMask = [.flexibleWidth, .flexibleHeight] /// allow resizing
self.addSubview(overlayView)
let gradientLayer = self.layer as! CAGradientLayer
gradientLayer.locations = [0, 0.45, 0.55, 1] /// adjust this to change the colors' spacing
gradientLayer.colors = [
UIColor.white.cgColor,
UIColor.yellow.cgColor, /// yellow + orange for gold effect
UIColor.orange.cgColor,
UIColor.white.cgColor
]
let startPointAnimation = CABasicAnimation(keyPath: #keyPath(CAGradientLayer.startPoint))
startPointAnimation.fromValue = CGPoint(x: 2, y: -1) /// extreme top right
startPointAnimation.toValue = CGPoint(x: 0, y: 1) /// bottom left
let endPointAnimation = CABasicAnimation(keyPath: #keyPath(CAGradientLayer.endPoint))
endPointAnimation.fromValue = CGPoint(x: 1, y: 0) /// top right
endPointAnimation.toValue = CGPoint(x: -1, y: 2) /// extreme bottom left
let animationGroup = CAAnimationGroup() /// group animations together
animationGroup.animations = [startPointAnimation, endPointAnimation]
animationGroup.duration = 2
animationGroup.repeatCount = .infinity /// repeat animation infinitely
gradientLayer.add(animationGroup, forKey: nil)
}
}
用法:
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let shimmerView = BorderShimmerView()
shimmerView.frame = CGRect(x: 50, y: 50, width: 300, height: 300)
view.addSubview(shimmerView)
}
}
结果:
推荐阅读
- python - 布尔切片引起的 SettingWithCopyWarning
- mysql - 为什么 DISTINCT 不删除重复项?
- php - 在远程数据库(MySQL)中选择 * 不会带来所有数据
- spring - Spring Boot 优雅关闭 Tomcat - 连接关闭管理
- laravel - 除非硬编码 ID,否则联接表不起作用
- swift - 如何让一条线跟随触摸而不是在 spritekit 中绘制无限?
- python - python shutil.make_archive - 没有嵌套目录结构的压缩
- python - 将两个较大的十六进制范围拆分为较小的相等范围
- javascript - 我想在做 mapSeries 后返回函数
- c++ - 我的结果并不是真正随机的。我怎样才能解决这个问题?