使用macruby,如何为Core Animation事务设置完成块?

时间:2011-05-01 01:37:11

标签: macos core-animation osx-snow-leopard macruby

我正在使用MacRuby进行核心动画编程。我已经尝试了所有我能想到的并且全部搜索过(也许它不能在'纯'macruby中完成)但我无法弄清楚如何将一块MacRuby代码指定为要调用的完成块动画交易完成时。我知道还有其他方法可以做我想要的事情,但这对我来说似乎是最干净的,而且事情在Cocoa中也是如此。无论如何,这就是我所拥有的:

CATransaction.begin  # start the transaction
#
# ...set up animation (works fine!)
#
CATransaction.setCompletionBlock(...)          <---- Here's the problem
CATransaction.commit  # end the transaction

没有'setCompletionBlock'行,动画运行正常。此setter方法的参数(在Objective-C中)定义为:

void (^)(void))block

被描述为:

  

“当此事务组的动画完成时调用的块对象。块对象不带参数,也不返回任何值。”

我尝试了不同的东西(但我只是在猜测这一点):

CATransaction.setCompletionBlock({ some code })

CATransaction.setCompletionBlock(Proc.new { some code })

CATransaction.setCompletionBlock(lambda { some code })

CATransaction.setCompletionBlock(method(:aMethod))
...
def aMethod
  ...
end

我离开了吗?我是否必须制作某种Objective-C包装器才能执行此操作?或者不能这样做?

提前致谢

1 个答案:

答案 0 :(得分:2)

好的,在通过分散的MacRuby笔记进行了相当迂回的旅行后,我发现了如何做到这一点。当然这是我早期尝试过的解决方案之一; 诀窍是安装(MacRuby) BridgeSupport预览 ,它与MacRuby安装分开,是我迄今为止还不知道也不需要的东西。将这一点放在这里将有望拯救某人寻找与问题无明显关联的答案的恶化。这是我原始示例(上图)的“完整”列表,其中添加了缺失的部分:

CATransaction.begin  # start the transaction
#
# ...set up animation (works fine!)
#
CATransaction.setCompletionBlock( Proc.new { puts "I'm done!" })      <-------
CATransaction.commit  # end the transaction

其中'puts'语句可以替换为在动画完成时执行的所需代码。

为Cocoa方法指定 的更一般的答案是使用:

Proc.new { ...code block... }

在方法调用中(如上所述)。如果在方法文档中指定了参数,也可以使用普通的ruby块定义语法提供参数。

可以从here 下载 MacRuby BridgeSupport预览版(MacRuby当前版和夜间版也可以)。