9VAe Mac版の Mojave 対応版をリリースしたが、Sierra より動作が遅い。32bit版アプリの動作が制限されているようだ。仕方がないので、64bit版への移植を開始。
Objective-C で移植します。Cプログラムの移植には、Swiftよりはるかに使いやすいです。
いろいろ試行錯誤を繰り返しなんとか動くようになったので、こちらで公開(9va-mac64)しました。
以下は、macOS 10.15 Catalina ベータ版での画面です。左上のフォルダが従来の9VAeで、32bit アプリなのでストップマークがついて実行できません。2つめのフォルダが今回移植した64bit版9VAeです。ストアアプリでないので最初に警告がでますが、マウス右ボタンメニュー>「開く」をもう一度実行すると、ちゃんと動作しました。
64bit版移植の方針
- Objective-C を使う。9VAe iOS版が Objective-C で書かれているので、それを利用して移植する。
- Objective-C のサンプルコードは、ネットから入手できなくなっている。そこで、古いMacOSのDVDにはいっている Xcode サンプル Sketch を使う。
- これを最新の Xcode で読み込むと新しいプロジェクトにコンバートしてくれる。
- イベント処理を残し、iOS版の9VAeのプログラムを追加し、Sketchの処理ルーチンを取り除く。
- iOSと macOSで関数が異なる部分を修正する。iOSのUI関数が、macOSでは使えない。また、mouseの処理、メニュー処理が iOSにないので追加する。
プロジェクトの修正
- Sketch プロジェクトの名前を QVAe に修正。
- MacOS Development Target を 10.10 にする
- Build Settings > Search Paths > Always Search User Paths(Deprecated) をNoにする
プロジェクトターゲットの修正
- General > App Icons (1)「Migrate」ボタンクリック(1回しか押してはいけない) (2) 左側のリスト > Resources > Images.xcassets > AppIcon (3) 右側に128x128 png アイコンをドラッグして追加
リソースの修正
- 古いアイコン Draw2App.icns を削除
- Draw2.nib > Localization > (1) English にチェック (2) English,deprecatedのチェックをはずす (3) Builds for を Deployment Target(10.7)
- Sketchを検索して9VAeに変更。(1) メニュー (2) infoplist.strings
ターゲットにリソースを追加
- ターゲット>Copy Bundle Resources > + をクリックしてファイルを追加
ターゲットにFramework 追加
- Cocoa
- CoreGraphics
- CoreFoundation
- CoreImage
- CoreMedia
- CoreText
- CoreVideo
- AVKit
- AVFoundation
SKTGraphicView を Window全体に一致させる
SKTGraphicView を 9VAeの描画ウィンドウにする。9VAeは Viewを1つしかもっていない。
- DrawWindow.nib のView の直下に SKTGraphicViewを移動
- Use Auto Layoutにチェック
- 上下左右値0の Constraints を追加
SKTGraphicView に Timerを追加
SKTGraphicView に mousemoved イベントを受けるよう設定
- 何もしないと mousemoved イベントが無視されるため、ホバー処理ができない。以下のコードを、初期化処理にいれる。
CGRect rect = CGRectMake(0.0f, 0.0f, self.frame.size.width, self.frame.size.height);
NSTrackingAreaOptions options = NSTrackingActiveInKeyWindow | NSTrackingMouseMoved | NSTrackingInVisibleRect;
NSTrackingArea *_trackingArea = [[NSTrackingArea alloc] initWithRect:rect options:options owner:self userInfo:nil];
[self addTrackingArea:_trackingArea];
objective c - NSView mouseMoved event sometimes doesn't fire - Stack Overflow
以下の関数を追加
- (void)mouseMoved:(NSEvent *)event
- (void)mouseUp:(NSEvent *)event
- (void)mouseDragged:(NSEvent *)event
- (void)rightMouseDown:(NSEvent *)event
- (void)rightMouseDragged:(NSEvent *)event
- (void)rightMouseUp:(NSEvent *)event
drawRect の処理
- Windowサイズが変更されたら画面バッファを作り直す
- SKTGraphicViewのcontextに対応したイメージを作成。描画はそこに行う
- drawRect では描画したイメージから毎回矩形転送する
タブの削除
- WindowController ウィンドウ生成時に以下をいれる
[NSWindow setAllowsAutomaticWindowTabbing: NO];
キー
ファイル開く
ファイル保存
メニュー
- メニューの表示項目変更、メニュー実行は以下のコードを SKTGraphicView.m に入れる。(NSInteger)[item tag] でメニュー項目に設定した tag 値を取得できる。それを9VAeLib にわたしてメニューの状態を得る。
- (BOOL)validateMenuItem:(NSMenuItem *)item {
int ret = [qvae qVAtestCommand:(int)[item tag]]; //tag はメニュー項目数値
[item setState:(ret&2 ? NSOnState : NSOffState)]; //チェックの切り替え
return ret&1 ? NO:YES; //灰色にするかどうかの切り替え
}
- メニュー項目の実行は以下のコード。メニューの tag に 9VAeLib の処理番号をいれておく
- Draw2.nib のメニュー項目>Outlets > Sent Action の(+)をドラッグして、FirstResponderのなかの qvaeCommand とつなぐ。
- (IBAction)qvaeCommand:(NSMenuItem *)menuItem{
[qvae qVAsendCommand:(int)[menuItem tag]]; //tag はメニュー項目数値
}
文字入力
フォント
アニメGIF出力
音再生
多国語対応
9View
deprecated 対応
いろいろ試行錯誤を繰り返し、メインルーチンを何度も書き直した結果、なんとか動くようになった。こちらで公開(9va-mac64)
Mojaveでdmgを作成すると、10.10でマウントできなくなった
- 新しいOSに対応せねばなるまいと、Mojave + Xcode11で開発していた。
- 新しいOSで動作しない問題点があったので、新OSへの対応ばかりやっていたら、ダウンロードモジュール dmg が、古いOSでマウントできなくなっているようだ!なんということだ。Appleの下位機種切り捨てにやられた。
- 古い機種に対応するためには、古いOSで作らないといかん。
- そうすると、今度は、Mojave でビュアが起動しなくなった。dmg のバージョンによってファイル名がかわるのか、アプリの性質がかわるのか??
Sandboxアプリの作り方
- Mac版をアプリストアに登録しようとすると、Sandboxアプリにしないといけないようだ。それに関するドキュメントは以下
NSURLConnection から NSURLSession への移行
Deprecated対応
Downloadファイルを開く方法
- UIDocumentPickerViewController
info.plist内に以下を追加し値をYES
にするとファイルアプリでコピーできるようになるようだ
UIFileSharingEnabled
(Application supports iTunes file sharing
)LSSupportsOpeningDocumentsInPlace
(Supports opening documents in place
)
Apple Silicon (Universal2)への対応
- Xcode 12.2 にすると、勝手にUniversal2 にしてくれるらしい。しかし、うかつにアップすると、プロジェクトがつくれなくなったりするので、慎重にやらんといかん。今の環境をおいておいて、古いMacに BigSur をいれて、試してみてからにすべき。移植のしかたのドキュメントは以下