在iOS视图中重复使用动画

时间:2017-01-11 12:21:03

标签: ios swift animation addtarget

不确定我的想法是否正确,但我在iOS项目中使用的动画类似,我想将其压缩为1个文件,并在任何我想要的地方重复使用。

一个简短的例子。在我的动画文件中,我有一个缩放动画

Animations.swift

class Animations {

    class func scaleSmall(_ view: UIView) {
        let scaleAnim = POPBasicAnimation(propertyNamed: kPOPLayerScaleXY)
        scaleAnim?.toValue = NSValue(cgSize: CGSize(width: 0.9, height: 0.9))
        view.layer.pop_add(scaleAnim, forKey: "scaleSmallAnim")
    }

}

这里我在View文件夹中有一个快速文件,我想将该动画添加到按钮

Button.swift

class Button: UIButton {

    override func awakeFromNib() {
        super.awakeFromNib()

        self.addTarget(self, action: #selector(Animations.scaleSmall(_:)), for: .touchDown)
    }

}

我以为我可以从其他文件中引用动画,但是每次我这样做都会得到相同的错误

' #selector'的论点指实例方法' scaleSmall'没有暴露于Objective-C

我引用此功能是错误的吗?

2 个答案:

答案 0 :(得分:1)

尝试更改class func scaleSmall(_ view: UIView) {

 @objc class func scaleSmall(view: UIView) {

答案 1 :(得分:1)

我已经确认了我的评论,所以我发布了答案。 UIButton的方法需要桥接到Obj-C。这就是@Kostas Tsoleridis在他的回答中提出的建议 - 它不是在一个文件中混合使用两种语言,而只是标记编译器的方法。其他解决方案是从NSObject类继承Animations

现在,正如您在评论中提到的混乱一样 - 它有效,因为您的Button类继承自UIButton,它既来自Obj-C世界,又继承自NSObject链条。

还要解决@Kostas Tsoleridis回答中的评论中提到的问题(说实话我以前应该考虑过) - 你不能将self作为目标并使用方法从另一个类(甚至是静态类)。要解决此问题,您可以使用Animations类的单例实例,如下所示:

class Animations {
    static let sharedInstance = Animations()
    @objc class func scaleSmall(_ view: UIView) {
        // your code
    }
}

let button = UIButton()
button.addTarget(Animations.sharedInstance, action: #selector(Animations.scaleSmall(_:)), for: .touchDown)