如何使用 perform(aSelector: , with: , afterDelay: , inModes: ) 在延迟后暂停 CABasicAnimation

Posted

技术标签:

【中文标题】如何使用 perform(aSelector: , with: , afterDelay: , inModes: ) 在延迟后暂停 CABasicAnimation【英文标题】:How to use perform(aSelector: , with: , afterDelay: , inModes: ) to pause a CABasicAnimation after a delay 【发布时间】:2018-12-14 23:52:39 【问题描述】:

我正在使用perform(aSelector: , with: , afterDelay: , inModes: ) 在指定延迟后暂停动画。但是,我不断收到无法识别的选择器错误。我不确定是什么原因造成的。

示例代码(更新):

    class ExpandingSelectedLayer: CALayer, CAAnimationDelegate
    

    let expandingAnim = CABasicAnimation(keyPath: #keyPath(CALayer.bounds))
expandingAnim.perform(#selector(expandingAnim.pauseAnim), with: nil, afterDelay: 2.0, inModes: [RunLoopMode.commonModes])
    


    extension CABasicAnimation 
    
            @objc func pauseAnim()
            
                print("called pause Anim")
                self.speed = 0

            
    

【问题讨论】:

【参考方案1】:

首先:perform(_:with:afterDelay:) 中的 anArgument 参数是传递给方法的参数。您问题中的选择器不接受任何参数,但您的 perform 调用正在向它传递一个参数。由于pauseAnim 不接受任何参数,您只需将nil 传递给anArgument 参数。

第二:从您的问题中不清楚pauseAnim 方法的定义位置。除非它是CABasicAnimation(或其类层次结构中的某处)上的方法,否则您将无法在CABasicAnimation 的实例上调用该方法。如果此方法是在视图控制器或其他对象上定义的,您可以将其用作接收器(可能是self)。

【讨论】:

以上是关于如何使用 perform(aSelector: , with: , afterDelay: , inModes: ) 在延迟后暂停 CABasicAnimation的主要内容,如果未能解决你的问题,请参考以下文章

iOS 一个新方法:- (void)makeObjectsPerformSelector:(SEL)aSelector;

如何在 XCUITest 中使用 perform(withKeyModifier:block:) 函数执行多选

如何在 C++ 中异步执行 curl_multi_perform()?

如何在python中执行某个时间段的功能?

TControl.Perform是有返回值的,且看VCL框架如何利用消息的返回值(全部例子都在这里)

消息转发流程