potatotips #69 に iOS ブログまとめ枠で参加させていただきました。
今回はTimersさん主催で、Zoomのウェビナーを使ったオンラインでの開催となりました。
[Android] 写真動画のフォルダ選択に対応した話 / akatsuki174 さん
写真フォルダを取得して表示する方法。
流れとしては
- ContentResolver を使ってデータを取得
- 加工しやすい形で格納
- データを表示する
取得するカラムなどを設定する。
ContentResolver のクエリとしてはこんな感じになる。
データの格納をして、
表示はよしなにする。
Android Q(10)〜では、Group by + Count で SQLiteException が起こったが、自前でハンドリングした。DATAはdeprecatedになっていたので、使わないようにした(パス自体は取る方法がある)
[iOS] For Developing URL Routing of SwiftUI App (SwiftUI時代のURLルーティングを考察する) / freddi さん
URL SchemeなどでURLが開かれて、アプリを特定の開くという状態を考える。
SceneDelegateでURLをパースして、特定の画面を開くとき、
以前は application(_:, open:, options:)
が呼ばれていた。
SceneDelegateではこっちが呼ばれる↑。
特典の画面を開く方法として UIApplication.keyWindow を使う方法があると思うが、これは Deprecated になっている。
SceneDelegate.window
を代わりに使う方法もあるが、scene(_ scene:, openURLContexts:)
を使って以下のように実装した。
ややこしくなってきたらCoordinatorのようなクラスを作るのがおすすめ。
[Android] ML Kit (Auto ML Vison Edge)で写真から家族を検出する / tsutou さん
犬、猫、子供、大人の画像を合計2万5千枚学習させて、入力写真がどれに属するかという分類をML Kit にやらせる。
ML Kit の学習のときは、 オプションに、下限レイテンシ、汎用、高精度を設定できる。
5時間ぐらいで割と精度が出た。
ML Kit はローカルのモデルを使用する運用、リモートのモデルを使用する運用、両方が選択できる。両方というのもあり。ローカルでやる場合はアプリサイズが増えてしまうが、それが許容できる場合はローカルに置いて、適宜リモートも使うという方法がよさそう。
実装方法はスライド参照。
[Q] アプリサイズはどのくらい大きくなりますか?
[A] 今回のだと 4MBぐらい
たぶん転移学習なのでそんなに容量食わない #potatotips
— Monkuma👾 (@kumamo_tone) 2020年4月27日
[macOS] Virtual Web Cameraを作ってみよう / kishikawa katsumi さん
Snap Camera 、どうなってるんだろうと思って中を見てみた。
インストーラーを見てみると、.pluginというファイルをインストールしているっぽい。
ここに置くとあたかもカメラが増えたようになる。
情報が少ないながらもにわかに盛り上がり始めている。
公式は、情報が32bit時代のやつでめちゃくちゃ古いが、PDFは2枚でよくまとまっている。
これを踏まえた上で、OBS用にやってくれてる人のコードとか、
同じ人が CoreMediaIO DAL plugin のサンプルを公開してくれたりしている。
さらにSwiftで書き換えてくれている人もいる。
これらを参考に、ウィンドウを重ねれるアプリを作ってみた。
やり方、つまづきそうなところだけ紹介する。まず、info.plistについて。Factory interface と右下のやつはなんでもいいんだけど値を合わせないといけない。
エントリーポイントの名前はここに対応している(C++の場合)。
サンプルバッファをCIImageにして位置を変えて合成。CIImageにしてオーバーレイ。AVCaptureSessionで画面をキャプチャ、ウィンドウのキャプチャもできる。データの受け渡しは、プロセス間通信が使えるはず。ただしモダンなやつが使えない。
[Android] Troubleshooting on Build & Release Flutter apps / Kenichi Kambara さん
Flutterアプリをリリースしようとしてみた。
Android側はRelease用の証明書をコンソールに登録しないと通らない。
Androidは透過画像がアイコンに設定できるのだが、iOSはアルファチャンネル入っているとArchive→Validate Appで弾かれる。
ソーシャルログインがある場合、Sign with Apple 対応しないとリジェクトされます。
Sign with Apple未対応でリジェクト、しょっぱい #potatotips
— Monkuma👾 (@kumamo_tone) 2020年4月27日
[iOS] Touch Bar on Catalyst / fromkk さん
以下書いたけど公式の書き起こしがあるのでそっちを見たほうが良い。
Catalyst から Touch Bar が使える。NSTouchBarとして表現される。限られているものの、 6種類ぐらい使える。
実装方法。
NSTouchBar.CustomizationIdentifierを定義。どのTouchBarかを識別する。
UIResponderはUIViewとかUIViewControllerとかが継承しちゃってるので複数が普通にあり得る...なので1つに絞る必要があるという感じ
— かっくん@社会復帰準備 (@fromkk) 2020年4月27日
NSTouchBarItem.Identiferで表示する項目の種類を識別。
CatalystではmakeTouchBarというメソッドを実装する。
NSTouchBarに生えているプロパティはこんな感じ。
カスタマイズできるかどうかはここで設定できる。
NSTouchBbarDelegateを実装する。メソッドは1個しかない。
NSTouchBarItemには、customizationLabelを設定しておくと、カスタマイズ時にラベルが表示されるようになる。
Touch Barを検索する場合順序があって、こんな感じになっている。
注意点。Swift UIでは表示できなかった。また、スライダーを表現するNSSliderTouchBarItemから取得するプロパティが無い。keyから取ってこれるけど心配。
サンプルコードは公開しています。
[Android] Tips on Databinding in RecyclerView / Shota Ara さん
RecycleView で LiveData を DataBinding する。
lifecycleOwner と model を binding に設定する。
今回話したいのは、lifecycleOwnerについて。
ここに何を渡すかというと、Activityなら、Activity自体だが、Fragmentの場合はviewLifecycleOwnerを渡す必要がある。
RecyclerViewの場合は? binding.root.contenxt as LifecycleOwner
を渡す。一見できているように見えるが、これだけだと挙動的にメモリリークしている。
解決方法。FragmentのLifecycleOwnerを渡せば良い。また、viewHolderをLifecycleOwnerにするという手もありそう。
[iOS] e-Conte board 開発話 / codelynx さん
https://speakerdeck.com/codelynx/e-conte-board-dev-story
絵コンテを作るためのアプリを作った。Apple Pencilで書き込める。
Core Graphics を使っている。
スクロールする方法はいくつかあるが、今回は3を採用(ペンと指で別の機能にする)。
タッチでdrawできなくしたり、pencilのときはZoomできなくしたりできる。
また、縦に広がるSegmentedToolControlというのを作った。
これについてはAdventCalendarに書いた。
また、コードはGithubで参照できる。
ちなみにアプリはダウンロードできるけど課金しないと使えない このアプリ使う可能性のある人って100人ぐらいしかいないので全員にダウンロードしてもらっても採算取れない せつない
[Android] ContextThemeWrapperでThemeをより賢く / rmakiyama さん
スライド
声
ContextThemeWrapperでThemeを動的に置き換えられる。
例として、ステータスが変わったらImageViewの背景色を変えるというのをやってみる。
既存のcontextを第1引数、置き換えたいやつを第2引数に指定する。
Viewの生成のときにも同じようにできる。
[iOS] SwiftUIでNeumorphism!!! / Ryo Tsuzukihashi さん
iOS6ぐらいまで使われていた、Neumorphismという考え方がある 現実の物質に似せて、直感的に操作を理解させるというやつ。
実装、ColorのExtensionでベースのカラーコードを受け取り、ベースの輝度のみを変えたもので影を作る。
shadow(color:radius:x:y)
を呼び出したら簡単に Neumorphism の影がつけられる。ライブラリにした↓
[Android] Wi-Fi Suggestion API / syarihu さん
[potatotips #69] Wi-Fi Suggestion APIhttps://t.co/4XzgnD7CHl
— syarihu🌙🎸syarihu.net (@syarihu) 2020年4月27日
本日の発表資料です!
発表聞いてくださったみなさまありがとうございました!#potatotips
おすすめの通知ダイアログとともにWiFi情報を自動で追加してあげる機能がある。
Q以上の場合は以前のAPIがdeprecatedになっているのもあり、Wi-Fi Suggestion API を使うと良い。
一回いいえで拒否されると、割と深いところで権限を取り直してもらわないといけなくなる。のでこれを出すときは割と丁寧なコミュニケーションをしないとユーザビリティ的に面倒なことになる。
このメッセージだが、2019年12月5日のアップデートで変わったので、同じAndroid 10 でもメッセージが違うという罠がある…
ブラックリストに入れられるとSSIDはどこからも確認できなくなってしまうので、解除について注意事項を書いておいたりすると良い
アンインストール時には削除されるのは、覚えておくと良さそう。
また、Android11以降は、大きな変更が入ってるっぽいので注意してみておくと良さそうとのこと。
[iOS] Custom Gesture Recognizer の世界 / TachibanaKaoru さん
Gesture Recognizerの話
ジェスチャが認識されている途中で音を鳴らすとかしたい
そういうときのために Custom Gesture Recognizer がある。
UITouchのpreviousLocationには直前にタッチした場所が入っている。
この位置が現在の位置と離れていれば離れているほど速く動いているってこと。
速さと同じようにgradient(方向)も取ることができる。
ジェスチャの各状態のときに、速さと方向が取れる。
P→P→P→Rなパターンのみ成立とみなす。
ストロークによっては、ユーザーの入力を意図通りに判断するのが難しい場合もあるため、状況に応じた最適化が必要。
コードはこちら
そのほか
- リモート参加だとディスプレイ広く使えるのでブログ書きやすくて良い
- カナダと福岡から発表している人もいてそれも良かった
- 個人的に内容も勉強になるのが多くてよかったです!
- QAがZOOM上でやれるのも良い
「2020/4/27 #potatotips (iOS/Android開発Tips共有会) 第69回」をトゥギャりました。 https://t.co/Tc45G36mPI
— Kosuke Ogawa🌒アルエンジニア🏝宮崎 (@koogawa) 2020年4月27日