頭と尻尾はくれてやる!

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


NSSegmentedControlで選択時の画像を白くする

NSSegmentedControlで文字を設定した場合
↑macOSのNSSegmentedControlで各項目に文字列を設定すると選択したところの文字の色は白になってくれる。

NSSegmentedControlで画像を設定した場合(1)
↑ところが文字ではなく画像を設定すると選択、非選択とも元の画像そのままだ。
青い背景だと選択時のが見にくい。できれば文字のように白くなった方が視認性が高い。
Xcodeで選択、非選択それぞれの画像を指定できるのか?と探すもなさそう。

なので自作した。
画像を白黒両方準備するのが面倒なので黒画像のみ作成しておき、白画像は黒画像を反転(※1)させたのを使用する。
クリック時にそれぞれの画像を選択、非選択で適切な画像を設定する、というのを完成させた。

ところがその後で気付いた。
元々それ用のコードが用意されてたことに。
NSSegmentedControlクラスではなくNSImageクラスのプロパティにisTemplateというのがある。
これを真にしておくだけ。
for index in 0..<segmentedControl.segmentCount {
segmentedControl.image(forSegment: index)?.isTemplate = true
}
↑あらかじめ全ての項目に設定しておくと

NSSegmentedControlで画像を設定した場合(2)
↑それだけで選択時には白くしてくれる。
あー、時間を無駄にした、、、



参考ページ
※1 Swift:左右反転した画像,白黒画像,ネガポジ反転画像を生成する - Qiita
スポンサーサイト






iOSアプリ、ポケモンGO用「わざタイプ相性表」をリリース

pokegochart_iconR.png
わざタイプ相性表

ポケモンGOに登場するポケモンたちの、わざとポケモンのタイプの相性を調べるアプリです。
レイドバトルでレイドボスに有効なわざを確認したり、GOバトルリーグで「XXXが出てきた時、どのポケモンに交代すれば有利だったのか?」など復習できます。
ポケモンGOで実装されていないポケモンのデータはありません。随時追加していきますので反映されるまで時間がかかります。
このアプリはポケモンGOの一ファンが作成したもので、公式なものではありません。


スクリーンショット

↑アップしたアプリの説明文、スクショがこんな感じ。

アプリ名に「ポケモンGO」という文字列を入れられないのはAppleの規約に従ってる。実際入ってるのがApp Storeには並んでいるのだが、これは審査する人によるんだろう。前のアプリ(個体値カメラ)で「for ポケモンGO」の文字列を入れて申請しリジェクトされてるので、再度やったら何されるかわからない(アカウント剥奪が怖い)ので、今回は大人しく最初からタイトルには「for ポケモンGO」は入れてない。けどアプリ内での表示やlaunch screenには入れてる。


一昨日の夕方に申請し、今朝4時頃に審査開始、通過してた。このアプリは日本語版のみなので審査の時間ってどうなるのかと思ってたがいつも通り朝起きたら審査が終わってた、というパターンだった。


申請直前の段階で最新のデータを入れたにもかかわらず、今朝いきなりポケモンGOにメガシンカが実装され、近所のジムでメガカメックスがレイドに登場してた、、、なるべく早くデータ更新版を申請せねば。


今回のアプリ、当初はGOバトルリーグでリアルタイムで対戦してる時に使えるように、相手のポケモンや自分のチームのポケモンの交代を音声でできるように開発してた。
ところがiOSで使える本家の音声認識(SFSpeechRecognizer等による)はポケモンの名前を聞かせてもそれに近い日本語を探すようになっていた。
なので「カイリキー!」と言っても「怪力」という文字列が返ってくるのだ。
それでは「怪力」だったら「カイリキー」と変換するようにやってみようと、自分の発声で返ってきた単語を片っ端からリストアップし、

変換例

↑こんな感じで変換を実装していたが、、、あまりにもキリがない。音声だけでポケモンを特定するのは無理筋だな、と思い撤退。
ポケモンの選択は普通にキーボードで手入力とし、対戦後に復習したい時に使えるような感じにまとめた。


可能なら英語版も、と思ったもののポケモン名やわざの名称を得られる信頼できそうなサイトが見つからず結局日本語版のみになった。


アプリはportraitでもlandscapeでも可能で、レイアウト切り替えやアニメーション時の移動などはほぼAutoLayoutの制約を書き直してる。だいぶ自分の中では使い慣れてきたなあ、と感じてきたが時代はSwiftUIですか、そうですか、、、


Appプレビュー用動画がアップロードできなかった

iOSアプリの申請時にアップするAppプレビュー用の動画(movファイル)がなぜか受け付けてくれないという状況に陥った。

エラーメッセージ

「FILE_RESAVE_CORRUPTED」
「1つ以上のAppプレビューのオーディオがサポートされていないか、破損しています。」
などとエラー表示されるのである。

ただ全てがダメなわけではなかった。
App Store Connectの申請ではiPhone用(6.5インチ、5.5インチ)、iPad用(2つあるが同じでも可)の3パターンが必要でそれぞれ2種類、合計6つの動画を用意してたのだが、半分は期待通りにアップロードできていたのだ。
なので、何が違うんだろうな?と色々と調べてた。

Appプレビューの仕様

↑これはAppプレビューの仕様の一部だが、オーディオに関し1トラック(ステレオ2チャンネル)もしくは2トラックでそれぞれLとRでステレオとある。

アップロードに失敗した動画を確認するとどうやらトラックが2つある。おそらく1トラックにステレオ2チャンネル。「おそらく」としたのはトラックの中身が何チャンネルまでか確認できなかったので。
だとしたら要求仕様から外れてたのでそりゃアップロードはできないだろう。

そもそも今回のAppプレビュー用動画は現在作成中のmacOSアプリで出力したものなのだが、動画ごとにトラックを用意していたために複数の動画から作成する場合はトラックが複数になっていた。
なので強引に1つのトラックになるようにして動画を出力したところApp Store Connectでアップロードできるようになった。


CocoaPodsでAdMob SDKを最新のバージョンにする

iOS14用にAdMob SDKを最新の7.64にしておくように、とGoogleからメールあり対応しようとした。
開発中のiOSアプリにAdMob SDKをCocoaPodsですでにインストールしてた。このSDKのバージョンは7.63だった。
let sdkVersion = GADRequest.sdkVersion()
↑これでバージョンを調べた。

最新版にするためにやったことは、ターミナルで該当するディレクトリに移動し、
pod update
しただけ!あまりにもすんなりだったのでちょっと感動した。すごいよ、CocoaPods!

ちなみに上記のバージョン確認方法は7.64でdeprecatedになり
let sdkVersion = GADMobileAds.sharedInstance().sdkVersion
↑これでバージョンを取得できる。



iOS 13.6
macOS 10.15.6 Catalina
Xcode 11.6


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





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