kumamotone’s blog

iOS/Android アプリエンジニアです https://twitter.com/kumamo_tone

potatotips #70 に参加しました (iOS/Androidブログまとめ) #potatotips

potatotips #70iOS ブログまとめ枠で参加させていただきました(Androidのもまとめました)。

今回はLINE Fukuokaさん主催で、Zoomのウェビナーを使ったオンラインでの開催となりました。

f:id:kumamotone:20200710200640p:plain

自分で見直すときのわかりやすさ重視でガッツリ元資料を引用していますが問題あればご連絡ください。

[iOS] Contributing to XcodeGen / @freddi

XcodeGen という YAMLでxcodeprojを管理できる OSS にコントリビュートした。

f:id:kumamotone:20200710201421p:plain

Swift Packageの依存が、Remoteにあるものしか解決できなかった。これをLocalでもできるようにした。

f:id:kumamotone:20200710201558p:plain

気をつけること、CONTRIBUTING.md というのがあるので読むでからPRする、後方互換性に気をつけるなど。

xcodegenの自動生成の機能もあるけどまだ実装中。

[Android] Jetpack Composeでテキストを装飾する話 / @uecchi

Jetpack Composeでテキストを装飾する方法を紹介。

テキスト全体を修飾

ふつうにTextの引数で設定する。

@Composable
fun StyledGreeting(name: String){
Text(
text = "Hello $name!",
color = Color.Green,
fontSize = 30.sp,
fontFamily = FontFamily.Cursive,
fontStyle = FontStyle.Italic,
fontWeight = FontWeight.Bold
)}

テキストの一部を修飾

従来のやつでは Spanned に対応するやつだが、 Annotated String というクラスを使う

@Composable
fun StyledGreeting2(name: String){
val greetingText = annotatedString {
pushStyle(SpanStyle(color = Color.Green))
append ("Hello ")
// 前にpushしたstyleは引き継がれる
pushStyle(SpanStyle(
fontSize = 40.sp,
// Snip fontFamily, fontStyle, fontWeight
fontSynthesis = FontSynthesis.All,
textDecoration = TextDecoration.Underline
append("$name!!")
pop()// 直近でpushしたstyleはpopできる
Text(text =
greetingText, fontSize = 30.sp)

こうなる

f:id:kumamotone:20200710203021p:plain

テキスト内にカスタム画像を表示

inline content というのがある。

@Composable
fun StyledGreeting3(name: String){
val inlineContentId = "InlineContent"
val greetingText = annotatedString {
append("Hello $name!!")
// inline contentを挿入
appendInlineContent(id = inlineContentId, alternateText = ":droid:")
// snip

inlineContent: map<String, InlineTextContent> を Text に渡す

@Composable
fun StyledGreeting3(name: String) {
val inlineContentId = "InlineContent"
val greetingText = // snip
val inlineContent = map0f(
inlineContentId to InlineTextContent(
Placeholder(
width = 30.sp,
height = 30.sp,
placeholderVerticalAlign = PlaceholderVerticalAlign.Center
){ alternateText ->
// このlambdaはComposable関数
CustomEmojiImage(imageResId = R.drawable.ic_android_robot)
})
Text(text = greetingText, fontSize = 30.sp, inlineContent = inlineContent)
}
@Composable
fun CustomEmojiImage(imageResId: Int){
Image(
modifier = Modifier.fillMaxSize(),
asset = vectorResource(id = imageResId),
contentScale = ContentScale.FillWidth
)}

こうなる

f:id:kumamotone:20200710203003p:plain

Jetpack Composeはこのようにプレビューが横に表示される。便利

f:id:kumamotone:20200710202859p:plain

サンプルコード

https://github.com/tsuyosh/JetpackComposeTextDemogithub.com

[iOS] ARKit 4.0 / @TachibanaKaoru

speakerdeck.com

f:id:kumamotone:20200710203115p:plain

ARKitの歴史

ARKit4 新機能を紹介していく。

Geo Anchor

f:id:kumamotone:20200710203555p:plain

AppleがMap情報を取得するときに収集した実際の建物の3D情報と、カメラ画像から分析した3D情報と、端末のGPS情報を組み合わせた仕組みで、非常に正確な位置測定が可能。

セカイカメラと同じようなことが簡単に実装できる。

現時点ではサンフランシスコ、シカゴ、マイアミ、ニューヨーク、ロサンゼルスだけで使える。

f:id:kumamotone:20200710203707p:plain

使い方

Depth with LIDAR (Scene Geometry with LIDAR?)

f:id:kumamotone:20200710203800p:plain

新しいiPad Pro だけで使える、センサーから光を照射してその反射光を使って物体までの距離や物体の種類がわかるようになる。

判定可能な物体は天井、ドア、床、椅子、テーブル、壁、窓、その他、の8種類。

3.5でも距離と種類は取得できたのだが、APIが使いやすくなった。

Face Tracking

TrueDepthカメラ搭載のみだったが、A12以上のプロセッサでも使えるようになった。(新しいiPhoneSEとか)

Reality Converter

Reality Converterというのが2020年1月にリリースされて、他のモデリングツールのファイルからUSDZファイルへ簡単に変換できるようになった。

f:id:kumamotone:20200710211458p:plain

次のiPhoneにLiDARが搭載されなかったらTachibanaさんのカシオミニがもらえます

[Android] license-list-pluginを使ってOSSライセンス画面を自動生成する / @syarihu

speakerdeck.com

OSSライセンス画面を手軽に作るためのツール、いくつかある

github.com

以下のような特徴がある。

  • ライセンスリストを自動生成し、yamlに定義ファイルを出力人が読みやすい形なので、ライセンスの追加/変更/削除も簡単にできる
  • oss-license-pluginと違いライセンスリストが隠蔽されていないため、差分も分かりやすい
  • 定義ファイルを元に表示用のhtmlを自動生成したり、カスタマイズした画面を提供するために利用可能なjsonの出力も可能
  • ローカルライブラリにも対応
  • ライセンスリストから除外したいライブラリがある場合は.artifactignoreに記述することで簡単に除外可能
  • cookpad/LicenseToolsPluginを使っている場合はcookpadプラグインで利用するlicenses.ymlからの移行も可能

f:id:kumamotone:20200710204930p:plain

json だけでなく HTML の形式でも吐ける。従来のより見た目も良い。

Github Actions に組み込んで自動でライセンス定義を更新することもできる。

聞いた範囲たいへん良さそうだが This plugin is still under development. とのこと

[iOS] Speech framework tips / @tsuzuki817

note にセルフテキストまとめがあるので詳しくはこちら!

note.com

Apple純正の音声認識フレームワーク。ローカル(iOS13〜)とサーバー版がある。

サーバーのAPIの制限は1リクエスト60秒(音声の長さ)。1時間に1000回まで。

NSSpeechRecognitionUsageDescription と NSMicrophoneUsageDescription を Info.plist に入れて使う。

f:id:kumamotone:20200710210028p:plain

共有会って喋って認識させてみた結果。

通話中は録音ができないのでデバッグ時には注意。

[Flutter] Creating Flutter Animations with Rive

docs.rive.app

Rive は Flutterで使えるアニメーションツール。前まで flare という名前だった。ツール flr ファイルを読み込んで使うだけ。

フリー版でも機能が使えるが、作ったファイル public にしなければならない。 private にしたければ、 21ドル/月か、年間プランだと14ドル/月。

iOSには対応しているけどAndroidには対応していない?(調べてない)

[iOS] UICollectionView iOS14 / @shiz

speakerdeck.com

iOS14 での UICollectionView の更新について。

SectionSnapShot

f:id:kumamotone:20200710211810p:plain

f:id:kumamotone:20200710211828p:plain

SectionSnapShot というのが追加された。セクションごとの折りたたみの状態を保存できたり、それのイベントハンドラがあったりする。

あと並び替えのサポートがされた。

Lists

f:id:kumamotone:20200710211949p:plain

UITableViewのような外見で、スワイプできる、デフォルトのレイアウトが用意されている、Compositional Layoutの上に作成できるなどの特徴がある。

Cell(View)の設定

struct で設定できるようになった。

f:id:kumamotone:20200710212413p:plain

いい感じに型を使ってセルの登録もできるようになった(これUITableViewにはないってことなのかな)

より深く理解したい人はAppleの公式サンプルコードがおすすめ。

Qiita にもまとめてくださっている。

qiita.com

[Android] getChangePayload in DiffUtil / @rmakiyama

speakerdeck.com

音声版

DiffUtil に getChangePayload というのがある。これはareItemsTheSameがtrueかつareContentsTheSameがfalseで呼ばれる。

f:id:kumamotone:20200710213204p:plain

変更に関するペイロードをオブジェクトで返せるので、細かい更新の制御が可能。画像の再読み込みが起こらずチラツキが起こらず、スマート。

f:id:kumamotone:20200710213252p:plain

Groupieにも同様の機能が提供されている。

サンプルコード

github.com

[iOS] Swift UIで勘違いした話 / @koher

speakerdeck.com

Stepper に $counter.count を渡すように、 NumberDisplay にも @Binding の $counter.count を渡していたら、コンパイルエラーでうまくいかなかった

というのも、Stepperでは双方向バインディングなんだが、NumberDisplayは単方向バインディングなので、

Viewでは @Binding ではなくシンプルにプロパティを持っておいて、プロパティを渡せば
単方向バインディングは実現できるということがフォーラムに聞いたらわかった 質問するのは大事ですね

[Android] Material Components for Android 1.2.0 and 1.3.0 / @NabeCott

speakerdeck.com

まだ開発中だが Material Components に入りそうな変更について。

f:id:kumamotone:20200710215506p:plain

SliderはSeekBarのMaterial Component版 目盛りの表示やTooltipの表示、範囲の選択などができる

f:id:kumamotone:20200710215529p:plain

ShapeableなImageViewなど

ほかにも複数行のタイトルが表示できるCollapsingToolbarやProgressBarのMaterial Component版、新しいTimePicker(In development)などが入りそう

[iOS] iOSアプリでWebRTC / @SatoHikaruDev

qiita.com

WebRTCのクライアント実装について理解を深めたい。

github.com

サンプルを参考に、どういう処理がされているのか見ていく。接続、SDPのやりとり、映像キャプチャなどについて実際のコードを交えて紹介。

[Android] Adaptive Cardsを使ってみた / @nakasho_dev

www.slideshare.net

adaptivecards.io

Adaptive Cards は、JSONで作成された、プラットフォームに依存しないUIのスニペット。特定のアプリに配信されると、JSONは周囲に自動的に適応するネイティブUIに変換する。Microsoftが推進していて、 Android iOS JavaScript ASP.NET .NET WPF Windows ReactNative などで使えるもよう

Adaptive Card Designer というのがあって、ノンプログラマーでもいい感じに編集できる。

感想

前回に続きリモート開催だったが、運営さんの頑張りなどによって、なんだったらリモートのほうがいい面あるんではと思えるぐらい良い感じだった ありがとうございます