使用Swift的自定义活动指示器

时间:2015-03-21 20:29:02

标签: swift animation

我正在尝试创建一个these之一的自定义活动指标。似乎有很多动画图像的方法,所以我试图找出最好的方法。

我在Photoshop + Aftereffects动画循环中找到了this教程,但正如评论指出的那样,它似乎过于复杂(而且我没有After Effects)。

tldr:我如何拍摄现有图像并将其设置为活动指示器(使用旋转/旋转动画或循环播放动画)

1 个答案:

答案 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%正常工作,但这就是我基本上可以处理它的方式。