在制作自定义 UIActivityIndicatorView 时遇到一些问题
Having some trouble making a custom UIActivityIndicatorView
我正在尝试以编程方式创建自定义 activity 指标视图。问题是它永远不会开始动画。这是 spinner.swift class:
的代码
import UIKit
class spinner: UIActivityIndicatorView {
var flag = Bool()
override init(frame: CGRect) {
super.init(frame: frame)
self.flag = true
self.isHidden = false
}
required init(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func startAnimating() {
self.animate()
}
func animate()
{
if flag == true
{
UIView.animate(withDuration: 0.3, animations: {
self.layer.setAffineTransform(CGAffineTransform(scaleX: 0.5, y: 1))
}) { (success) in
if success == true
{
UIView.animate(withDuration: 0.3, animations: {
self.layer.setAffineTransform(CGAffineTransform.identity)
}, completion: { (success) in
if success == true
{
self.animate()
}
})
}
}
}
}
override func stopAnimating() {
self.flag = false
}
override func draw(_ rect: CGRect) {
let path = UIBezierPath(ovalIn: rect)
UIColor.cyan.setStroke()
path.stroke()
UIColor.red.setFill()
path.fill()
}
}
这是我添加微调器的 viewDidLoad() 中的代码:
let aiv = spinner(frame: CGRect(x: self.view.bounds.width/2-35, y: self.view.bounds.height/2-35, width: 70, height: 70))
aiv.hidesWhenStopped = true
self.view.addSubview(aiv)
aiv.startAnimating()
print(aiv.isAnimating)
print(air)
我根本没有看到微调器,并且在控制台中收到以下消息:
false
<spinner.spinner: 0x7f82b3e08240; baseClass = UIActivityIndicatorView; frame = (170 298.5; 35 70); transform = [0.5, 0, 0, 1, 0, 0]; hidden = YES; animations = { transform=<CABasicAnimation: 0x6080000364a0>; }; layer = <CALayer: 0x608000035120>>
根据日志,微调器是隐藏的,这意味着它从未开始动画。
如果有人能指出我哪里出错了,并提出可能的修复建议,那就太好了。
谢谢!
您的问题出现是因为来电:
aiv.hidesWhenStopped = true
并且 属性 isAnimating returns false 因为您覆盖了动画方法而不是使用基础方法。
当您开始和停止您的自定义动画时,您应该在您的自定义 class 中设置这个 属性。
同样的情况是hidesWhenStopped。这应该由您在 class 中实现。
我还建议将 UIView 用作内部带有 UIActivityIndicator 的子 class,因为如果您想启动 ActivityIndicator,AffineTransformation 可能会相互干扰。
我正在尝试以编程方式创建自定义 activity 指标视图。问题是它永远不会开始动画。这是 spinner.swift class:
的代码import UIKit
class spinner: UIActivityIndicatorView {
var flag = Bool()
override init(frame: CGRect) {
super.init(frame: frame)
self.flag = true
self.isHidden = false
}
required init(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func startAnimating() {
self.animate()
}
func animate()
{
if flag == true
{
UIView.animate(withDuration: 0.3, animations: {
self.layer.setAffineTransform(CGAffineTransform(scaleX: 0.5, y: 1))
}) { (success) in
if success == true
{
UIView.animate(withDuration: 0.3, animations: {
self.layer.setAffineTransform(CGAffineTransform.identity)
}, completion: { (success) in
if success == true
{
self.animate()
}
})
}
}
}
}
override func stopAnimating() {
self.flag = false
}
override func draw(_ rect: CGRect) {
let path = UIBezierPath(ovalIn: rect)
UIColor.cyan.setStroke()
path.stroke()
UIColor.red.setFill()
path.fill()
}
}
这是我添加微调器的 viewDidLoad() 中的代码:
let aiv = spinner(frame: CGRect(x: self.view.bounds.width/2-35, y: self.view.bounds.height/2-35, width: 70, height: 70))
aiv.hidesWhenStopped = true
self.view.addSubview(aiv)
aiv.startAnimating()
print(aiv.isAnimating)
print(air)
我根本没有看到微调器,并且在控制台中收到以下消息:
false
<spinner.spinner: 0x7f82b3e08240; baseClass = UIActivityIndicatorView; frame = (170 298.5; 35 70); transform = [0.5, 0, 0, 1, 0, 0]; hidden = YES; animations = { transform=<CABasicAnimation: 0x6080000364a0>; }; layer = <CALayer: 0x608000035120>>
根据日志,微调器是隐藏的,这意味着它从未开始动画。
如果有人能指出我哪里出错了,并提出可能的修复建议,那就太好了。 谢谢!
您的问题出现是因为来电:
aiv.hidesWhenStopped = true
并且 属性 isAnimating returns false 因为您覆盖了动画方法而不是使用基础方法。
当您开始和停止您的自定义动画时,您应该在您的自定义 class 中设置这个 属性。
同样的情况是hidesWhenStopped。这应该由您在 class 中实现。
我还建议将 UIView 用作内部带有 UIActivityIndicator 的子 class,因为如果您想启动 ActivityIndicator,AffineTransformation 可能会相互干扰。