頭と尻尾はくれてやる!

iOSアプリなどの開発日記です


macOSアプリ「AppPreview Editor」をリリースしました

AppPreview Editorのアイコン

AppPreview Editor

AppPreview Editorのスクリーンショット

操作が簡単な動画編集用のmacアプリです。
その名の通りiOSアプリの紹介用ビデオであるAppプレビューを作成するためのmacアプリです。

アプリ申請時にApp Store Connectに提出するAppプレビューはサイズやフレームレートや音声などにきっちりと規格があるので、これを外すと正常にアップロードできません。その規格に合うような動画を出力します。

無料アプリですが出力された動画に無駄にロゴが入っていますが、有料でこれを削除できるようになっています。



以下開発関連の雑談です。
そもそもiMovieでテキストが楽に編集できればいいのですが、なんとも微妙なのでなんとかならないかなあという思いからこのアプリを作りました。
自身初のmacOSアプリなので、とにかくリリースすることを目標にしていましたので、今後いくつか機能追加する予定です。
アプリ名にAppPreviewと入れてたのでAppleに怒られるのかな?と思ったけど無事審査通過してよかったです。
スポンサーサイト






macOSでNSViewの下のボタンをクリックできなくしたい

当然、NSViewオブジェクトの下に隠れたボタンはクリックできないだろう、と思っていたんだけどどうもmacOSではできるっぽい。

↑というツイート後に試行錯誤した結果、、、
NSButtonのサブクラスでhitTest(_:)をoverrideして、そこで被せてるviewオブジェクトもクリックしてるようならnilを返す(ボタンは無効)ようにすれば意図通りに動くことを確認した。
    override func hitTest(_ point: NSPoint) -> NSView? {
if let _ = cover.hitTest(point) {
return nil
}
return super.hitTest(point)
}
あらかじめ上に被さるNSViewオブジェクトの参照(↑のコードだとcover)をもらっておく必要がある。

とりあえず機能することはわかったんだけど、サブクラス作るのも参照もらっておくのも面倒だし、イマイチすっきりしないなあ。



macOS 10.15.6 Catalina
Xcode 11.6
Swift 5.2.4



undoするとなぜか一番最初まで戻る(未解決)


↑こういうツイートをしたんだけど、少し詳細に。

動画ではincreaseというボタンを1回押すたびに値が1増え、その都度undoの処理を
registerUndo(withTarget:handler:)
で登録している。
なのでundoを実行すると値が1減ることを期待するのだが、なぜかある場合では一番最初まで戻ってしまうのだ。


色々試したところ、この不具合?(仕様?)が起きるのはメインのviewControllerに
presentAsModalWindow(_:)
で別なviewControllerを追加してそこで実行した場合のみ発生した。他の追加方法で
presentAsSheet(_:)
present(_:asPopoverRelativeTo:of:preferredEdge:behavior:)
present(_:animator:)
などがあるが、どれも期待通りに動いた。
先のツイートの動画ではわかりやすいようにundoボタンを使っているが⌘+zでも同様。
また、メインのviewControllerのviewで実行しても期待通りに動く。

結局原因わからず、、、presentAsModalWindow(_:)を使うのをやめる方向でアプリ開発は対応するかなあ。
何かわかったら教えてください。



macOS 10.15.6 Catalina
Xcode 11.6
Swift 5.2.4


1枚の画像からicnsファイルを作成する

macOSアプリのdocument based appだとアプリのアイコン以外に書類のアイコンも設定できる。

Xcodeのプロジェクトファイルのアイコン

↑Xcodeだとこんな感じのやつ。

これを設定しようとしたら随分はまった。

アイコンの設定画面

↑そもそもここでpng画像を指定しても実際の書類のアイコンに全く反映しない。

icnsファイルなるものにすればいけるという記事を見てそれを作ろうとしたら準備する画像の種類やらフォルダ名やら色々と決まり事があるみたい。

この画像で決まり!というものがあればそこから必要な画像を作成(サイズを変えて出力)すればいいんだろうけど、試行錯誤したいのでその都度複数のサイズで出力してicnsファイルをターミナルで出力して、、、というのが面倒なので1024x1024pxサイズの画像1枚からicnsファイルを出力するようなmacOSアプリを作った。

1. デスクトップにフォルダを作成し、1枚の画像からリサイズした画像数枚をそこに保存
2. そのフォルダからicnsファイルをデスクトップに出力
という処理を行う。

実行後に出力されたフォルダとicnsファイル

↑実行後にフォルダとicnsファイルがデスクトップに出力されるはず。

元画像はXcodeにコピーせずに参照だけ持ってくるようにしておけば、画像作成アプリで出力した後にこのアプリのコードを実行でicnsファイルが簡単にできる。

YamaguchiTatsuya/MakeIcns: This macOS project makes icns file from one 1024x1024 image.
↑コードはGitHubのこちらに。


なお、icnsファイルで書類アイコンを設定するとちゃんと反映した。



macOS 10.15.5 Catalina
Xcode 11.6
Swift 5.2.4


macOSでFinderなどからtableにドラッグ&ドロップする



↑このようにアプリ外のファイルをNSTableViewオブジェクトにドラッグ&ドロップする。
NSTableViewはNSViewを継承している(※1)のでNSViewからのドラッグ&ドロップと同じでは?と最初は思ったが別な記述が必要になる。

optional func tableView(_ tableView: NSTableView, 
validateDrop info: NSDraggingInfo,
proposedRow row: Int,
proposedDropOperation dropOperation: NSTableView.DropOperation)
-> NSDragOperation
というNSTableViewDataSourceのメソッドでtableにドロップが可能かどうかの判定を行ってたりする。
実際にドロップされたファイル名などはNSTableViewのサブクラスで処理されるので、tableに表示するためdelegateを使ってViewControllerに渡し、tableに表示している。


YamaguchiTatsuya/DragAndDrop_OtherToTable: masOS sample code to drag and drop files from other app to NSTableView object
↑GitHubに置いたサンプルコードはこちら。



※1 NSTableViewの親はNSControlで、その親はNSView



macOS 10.15.2 Catalina
Swift 5.1.3
Xcode 11.3.1



関連記事
macOSでFinderなどからviewにドラッグ&ドロップする
macOSの同一アプリ内で画像などをドラッグ&ドロップする
macOSで同一アプリ内でtableからviewへドラッグ&ドロップする
macOSでFinderなどからtableにドラッグ&ドロップする(当記事)


参考記事
Using Drag and Drop with NSTableView — Nate Thompson
Drag and Drop Tutorial for macOS | raywenderlich.com




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.