スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

RubyCocoaでアニメーション:もっとRubyらしく

 前にもちょっと書いたけれど、RubyCocoaのバージョンが上がって、CocoaのオブジェクトをRubyの様に使えるようになったり、RubyのオブジェクトをCocoaで使えるようにするのが簡単になったりした。
 そしてこの新しいバージョンのRubyCocoaはこの間のOSアップデート(10.5.2)には含まれているそうだ。

 ということで、早速使ってみた。まずは、簡単なところから。awakeFromNIbでフィルターに値を設定している箇所である。
filter = OSX::CIFilter.filterWithName_('CIBloom')
filter.setDefaults
filter.setValue_forKey_((0.0).to_ns, 'inputIntensity')
filter.setValue_forKey_((5.0).to_ns, 'inputRadius')
filter.setName_('plusFilter')

今まではsetValueの時にはNSNumberオブジェクトに変換するために
OSX::NSNumber.numberWithFloat_(0.0)

と書いてやらなければならなかったのだが、これが
(0.0).to_ns

と数字の後ろに".to_ns"と書けば良くなった。こういう書き方は、数値でも何でもオブジェクトになっているRubyならではだね。

このto_nsはかなり強力で、Rubyの配列をCocoaのNSArrayに変えることもできる。だからこの後で、filterの配列をレイヤーにセットするところでも
filterArray = [filter,filter2]
transitionLayer.setFilters_(filterArray.to_ns)

とこのように、Rubyの配列として作ってあげて、プロパティに設定するときに最後に".to_ns"をつけて変換してやればいい。

また、これとは逆にCocoaのNSArrayやNSDisctionaryをRubyの配列やハッシュのように使うこともできる。だから、doAnimationでレイヤーを取ってくるコードは今までは、
layer = @view.layer.sublayers.objectAtIndex_(0)

と書いていたところ、
layer = @view.layer.sublayers[0]

と書ける。またchangeContentsでアクションを登録していた場所では、
layerActions = OSX::NSMutableDictionary.alloc.init
layerActions.setObject_forKey_(transition,'contents')


layerActions = OSX::NSMutableDictionary.alloc.init
layerActions['contents'] = transition

と書けるようになった。

これは、単純に書かなければいけないコードが少なくなったというのもあるけれど、それよりも、よく似た概念なのに、アクセスするために全然別のコードを書かなくても良くなったという方が大きい。結構こういうのってストレス溜まるんだよね。間違いも起きやすいし。
スポンサーサイト

Comment

Post comment

Secret

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。