我正在尝试创建一个these之一的自定义活动指标。似乎有很多动画图像的方法,所以我试图找出最好的方法。
我在Photoshop + Aftereffects动画循环中找到了this教程,但正如评论指出的那样,它似乎过于复杂(而且我没有After Effects)。
tldr:我如何拍摄现有图像并将其设置为活动指示器(使用旋转/旋转动画或循环播放动画)
答案 0 :(得分:1)
你发布这个问题已经有一段时间了,所以我不确定你是否找到了你想要的答案。
你是对的有很多方法可以做你所要求的,我认为没有“正确的方法”。我会创建一个UIView
对象,它有一个start和stop方法作为唯一的公共方法。
我也会使它成为一个单例,所以它是一个共享对象,不可能将多个实例放在一个UIViewController
(想象它可能造成的混乱)
您可以添加一个返回UIViewController
的dataSource协议,以便自定义活动指示器可以将其自身添加到其父级。
在start方法中,我会做任何需要的动画(变换,旋转,GIF等)。
这是一个例子:
import UIKit
protocol CustomActivityIndicatorDataSource {
func activityIndicatorParent() -> UIViewController
}
class CustomActivityIndicator: UIView {
private var activityIndicatorImageView: UIImageView
var dataSource: CustomActivityIndicatorDataSource? {
didSet {
self.setupView()
}
}
// Singleton
statice let sharedInstance = CustomActivityIndicator()
// MARK:- Initialiser
private init() {
var frame = CGRectMake(0,0,200,200)
self.activityIndicatorImageView = UIImageView(frame: frame)
self.activityIndicatorImageView.image = UIImage(named: "myImage")
super.init(frame: frame)
self.addSubview(self.activityIndicatorImageView)
self.hidden = true
}
internal required init?(coder aDecoder: NSCoder) {
self.activityIndicatorImageView = UIImageView(frame: CGRectMake(0, 0, 200, 200))
self.activityIndicatorImageView = UIImage(named: "myImage")
super.init(coder: aDecoder)
}
// MARK:- Helper methods
private func setupView() {
if self.dataSource != nil {
self.removeFromSuperview()
self.dataSource!.activityIndicatorParent().addSubview(self)
self.center = self.dataSource!.activityIndicatorParent().center
}
}
// MARK:- Animation methods
/**
Set active to true, and starts the animation
*/
func startAnimation() {
// A custom class which does thread handling. But you can use the dispatch methods.
ThreadController.performBlockOnMainQueue{
self.active = true
self.myAnimation
self.hidden = false
}
}
/**
This will set the 'active' boolean to false.
Remeber to remove the view from the superview manually
*/
func stopAnimation() {
ThreadController.performBlockOnMainQueue{
self.active = false
self.hidden = true
}
}
}
请注意,这尚未经过全面测试,可能需要进行一些调整才能100%正常工作,但这就是我基本上可以处理它的方式。