2

私はMacRubyを使用してCoreAnimationプログラミングを行っています。考えられることをすべて試し、検索しました(おそらく、「純粋な」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'行がないと、アニメーションは正常に実行されます。このセッターメソッドのパラメーターは、(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ラッパーを作成する必要がありますか?それともできませんか?

前もって感謝します

4

1 に答える 1

2

さて、散らばったMacRubyのメモを検索してかなり回り道をした後、私はこれを行う方法を見つけました。もちろん、これは私の初期の解決策の1つです。秘訣は、MacRubyのインストールとは別の(MacRuby)BridgeSupport Previewをインストールすることでした。これは、私が今まで知らなかった、または必要とされなかったものでした。ここにそれを置くことは、うまくいけば、明らかに問題に関連していない答えを探すことの悪化を誰かが救うでしょう。これが私の元の例(上記)の「完全な」リストで、不足している部分が追加されています。

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ブロック定義構文を使用して引数を指定することもできます。

MacRuby BridgeSupportプレビューはここからダウンロードできます MacRubyの現在および夜間のリリースもダウンロードできます)。

于 2011-05-02T10:04:14.313 に答える