2017-01-11 2 views
0

Не уверен, что мое мышление здесь верно, но у меня есть аналогичные анимации, которые я использую во всем моем проекте iOS, и я хотел бы сконденсировать его в 1 файл и повторно использовать там, где захочу.Повторное использование анимации во всех представлениях iOS

Краткое описание. В моем файле анимации у меня есть масштаб анимации

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) 
    } 

} 

Я думал Wou л.д. иметь возможность ссылаться на анимацию из дополнительного файла, однако каждый раз, когда я делаю это таким образом, я получаю ту же ошибку

Аргумент «#selector» относится к методу экземпляра «scaleSmall», который не подвергается Objective-C

Я ссылаюсь на эту функцию неправильно?

+0

Вы делаете это правильно. Его просто, что классы Swift не полностью совместимы с Obj-C, а 'UIKit' (т. Е.' UIButton') находится в мире Obj-C. Вы можете попробовать либо наследовать из 'NSObject' классом' Animations', либо пометить ваш метод как '@ objc'. – Losiowaty

+0

Сложная вещь для меня - если у меня есть анимация внутри моего класса Button, я могу получить к ней доступ с #selector (Button.scaleSmall), и он работает правильно. Вскоре, когда я вытащил его из файла, я не могу правильно его исправить. – user934902

ответ

1

попробуйте изменить class func scaleSmall(_ view: UIView) {

в

@objc class func scaleSmall(view: UIView) { 
+0

Попытка сохранить чистый swift-файл, а не смешивать objc, если мне не нужно – user934902

+0

, это не смешение objc с быстрым кодом, @objc, прежде чем функция просто флаг для компилятора. –

+0

Таким образом, он избавляется от моей ошибки, но следующая проблема, которая у меня есть, - это неудачный «непризнанный селектор» приложения, отправленный экземпляру. Сейчас некоторые расследования в этом случае – user934902

1

Я подтвердил свой комментарий, поэтому я отправляю ответ. Методы UIButton должны быть соединены с Obj-C. Вот что предлагает @ Kostas Tsoleridis с его ответом - он не смешивает два языка в одном файле, вы просто отмечаете метод для компилятора. Другое решение - наследовать от NSObject вашим классом Animations.

Теперь, как уже говорилось в комментарии ваше замешательство - это сработало, потому что ваш Button класс наследует от UIButton который и от мира Obj-C, а также наследует от NSObject вниз цепи.

Чтобы ответить на вопрос, упомянутый в комментарии в ответ на @Kostas Tsoleridis (и, честно говоря, я должен был подумать об этом раньше) - вы не можете передать self в качестве цели и использовать метод из другого класса (даже статический). Чтобы решить эту проблему, вы можете использовать экземпляр singleton вашего класса 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) 
+0

Я начинаю видеть, что вы, ребята, сейчас говорите – user934902

 Смежные вопросы

  • Нет связанных вопросов^_^