不确定我的想法是否正确,但我在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
我引用此功能是错误的吗?
答案 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)