Archive for the 'NSAnimationContext' Category

2013/09/24 AppleScriptObjCでCore Animation

AppleScriptObjCで、CoreAnimationを使用してLine(ほっそいNSBox)を360度回転させるサンプルです。

ani4.png
▲こういうひとたちです(Line=ほっそいNSBox)

AppleScriptObjCでCoreAnimationを利用する方法をいろいろ探していて、ようやくサンプルを見つけていじくっていました。一番大変だったのは、Viewに対するCore Animationの有効設定をXcode上で行う方法を見つけること。

ani2.png

ani3.png

これだけ(↑)。

XcodeのInterface Builderで「Core Animation Layer」にチェックを入れるだけ。これだけです。

AppleScriptObjCとCore Animationというと、月とスッポン、水と油ぐらい世界が違うもので……本当に探すのに苦労しました(結局、MacScripter.netにあったのを見つけられなかっただけでした、、)。

ani.png
▲反時計まわりに、おおよそ1回転まわります

ただ、360度回してみようとしているのですが、きっちり360度は回ってないですね(誤差として許容され得るものか、、、)。試行錯誤の最中です。

→ Xcodeプロジェクトのダウンロード(64KB)

AppleScriptObjCファイル名:AppDelegate.applescript

– AppDelegate.applescript
– vAnimation

– Created by Takaaki Naganoya on 2013/09/23.
– Copyright (c) 2013年 Takaaki Naganoya. All rights reserved.


script AppDelegate
  
  property parent : class “NSObject”
  
property aTextField : missing value
  
  property arrow : missing value – IBOutlet for a long narrow NSBox
  
  on applicationWillFinishLaunching_(aNotification)
    – Insert code here to initialize your application before any files are opened
  end applicationWillFinishLaunching_
  
  on applicationShouldTerminate_(sender)
    – Insert code here to do any housekeeping before your application quits
    
return current application’s NSTerminateNow
  end applicationShouldTerminate_
  
  
  on awakeFromNib()
    –arrow’s layer()’s setAnchorPoint_({0.5, 0.5})
    
arrow’s layer()’s setAnchorPoint_({0.5, 1.0})
    
set xValue to (arrow’s layer()’s superlayer()’s |bounds|()’s |size|()’s width) / 2
    
    –set yValue to (arrow’s layer()’s superlayer()’s |bounds|()’s |size|()’s height) / 2
    
set yValue to (arrow’s layer()’s superlayer()’s |bounds|()’s |size|()’s height)
    
–arrow’s layer()’s setPosition_({xValue, yValue})
    
  end awakeFromNib
  
  
  on click_(sender)
    
    set ctx to current application’s NSAnimationContext’s currentContext()
    
–ctx’s setDuration_(0.1)
    
    repeat with i from 0 to 63 by 1
      
      set curI to (i / 10) as real
      
      aTextField’s setStringValue_(curI as string)
      
      arrow’s layer()’s setValue_forKeyPath_(curI, “transform.rotation”) – Rotation by degrees counterclockwise
      
      tell current application
        delay 0.1
      end tell
      
    end repeat
    
  end click_
  
end script

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に