0

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

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

动画.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 文件夹中有许多 swift 文件之一,我想将该动画添加到按钮

按钮.swift

class Button: UIButton {

    override func awakeFromNib() {
        super.awakeFromNib()

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

}

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

'#selector' 的参数是指没有暴露给 Objective-C 的实例方法 'scaleSmall'

我引用这个函数错了吗?

4

2 回答 2

1

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

现在,正如您在评论中提到的困惑 - 它起作用了,因为您的ButtonUIButton既继承自 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)
于 2017-01-11T12:34:39.627 回答
1

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

 @objc class func scaleSmall(view: UIView) {
于 2017-01-11T12:26:28.910 回答