こんにちは、Sleipnir 3 for Mac 開発担当の宮本です。
OS X Lion では、スワイプ(スクロール)によるページ切り替えやフルスクリーンなど、魅力的な新機能が追加されました。 Sleipnir 3 for Mac では、これらの新機能をいち早く取り入れています。
ただ、これらの機能は10.7以降の API が必要なので、Snow Leopard では使えません。かといって切り捨てられないので、Lion だけ新しい API を使うようにしたいですね。 また、Lion では新しい API を使ってもビルドできますが、Snow Leopard ではできません。 Snow Leopard でも開発をしているので、これは問題です。
そこで、今回は Lion と Snow Leopard どちらでも動作して、なおかつどちらの OS でも開発できる方法を紹介します。
Lion で定義されている API が Snow Leopard では定義されていません。 普通にこれらの API を呼び出すコードがあれば警告やエラーがでてしまうので、同じものを Snow Leopard で定義してしまいます。やることはこれだけです。 警告とエラー防ぐためのものであって、Snow Leopard で呼び出されないようにコードは書くので実装は必要ありません。
#if !defined(MAC_OS_X_VERSION_10_7) || MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_7 @interface NSWindow (LionAPIs) - (void)toggleFullScreen:(id)sender; @end enum { NSWindowCollectionBehaviorFullScreenPrimary = 1 << 7, NSWindowCollectionBehaviorFullScreenAuxiliary = 1 << 8 }; enum { NSFullScreenWindowMask = 1 << 14 }; enum { NSWindowFullScreenButton = 7 }; enum { NSEventPhaseNone = 0, NSEventPhaseBegan = 0x1 << 0, NSEventPhaseStationary = 0x1 << 1, NSEventPhaseChanged = 0x1 << 2, NSEventPhaseEnded = 0x1 << 3, NSEventPhaseCancelled = 0x1 << 4, }; typedef NSUInteger NSEventPhase; enum { NSEventSwipeTrackingLockDirection = 0x1 << 0, NSEventSwipeTrackingClampGestureAmount = 0x1 << 1 }; typedef NSUInteger NSEventSwipeTrackingOptions; @interface NSEvent (LionAPIs) + (BOOL)isSwipeTrackingFromScrollEventsEnabled; - (NSEventPhase)phase; - (CGFloat)scrollingDeltaX; - (CGFloat)scrollingDeltaY; - (void)trackSwipeEventWithOptions:(NSEventSwipeTrackingOptions)options dampenAmountThresholdMin:(CGFloat)minDampenThreshold max:(CGFloat)maxDampenThreshold usingHandler:(void (^)(CGFloat gestureAmount, NSEventPhase phase, BOOL isComplete, BOOL *stop))trackingHandler; @end #endif // MAC_OS_X_VERSION_10_7
あとは、こんなものを書いて、Lion と Snow Leopard で処理を分けるだけです。
#define LION if (osVersion() == 10.7) #define ELSE else
LION { [win toggleFullScreen:nil]; }
今回は Mac の話でしたが、iOS でも同じです。下位互換を保ちつつ、新機能を取り入れたい時に使ってみてください。