potatotips #70 に iOS ブログまとめ枠で参加させていただきました(Androidのもまとめました)。
今回はLINE Fukuokaさん主催で、Zoomのウェビナーを使ったオンラインでの開催となりました。
自分で見直すときのわかりやすさ重視でガッツリ元資料を引用していますが問題あればご連絡ください。
[iOS] Contributing to XcodeGen / @freddi
XcodeGen という YAMLでxcodeprojを管理できる OSS にコントリビュートした。
Swift Packageの依存が、Remoteにあるものしか解決できなかった。これをLocalでもできるようにした。
気をつけること、CONTRIBUTING.md というのがあるので読むでからPRする、後方互換性に気をつけるなど。
xcodegenの自動生成の機能もあるけどまだ実装中。
xcodegen 、一人プロジェクトだとあまり使いどころがないのです……。 #potatotips
— Kaoru (@TachibanaKaoru) 2020年7月10日
App Clips とか、iOS/watch とか、マルチターゲットになると xcodegenも必要性があがるかもですね。 #potatotips
— Kaoru (@TachibanaKaoru) 2020年7月10日
[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)
こうなる
テキスト内にカスタム画像を表示
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 )}
こうなる
Jetpack Composeはこのようにプレビューが横に表示される。便利
サンプルコード
https://github.com/tsuyosh/JetpackComposeTextDemogithub.com
[iOS] ARKit 4.0 / @TachibanaKaoru
ARKitの歴史
ARKit4 新機能を紹介していく。
Geo Anchor
AppleがMap情報を取得するときに収集した実際の建物の3D情報と、カメラ画像から分析した3D情報と、端末のGPS情報を組み合わせた仕組みで、非常に正確な位置測定が可能。
セカイカメラと同じようなことが簡単に実装できる。
現時点ではサンフランシスコ、シカゴ、マイアミ、ニューヨーク、ロサンゼルスだけで使える。
使い方
Depth with LIDAR (Scene Geometry with LIDAR?)
新しいiPad Pro だけで使える、センサーから光を照射してその反射光を使って物体までの距離や物体の種類がわかるようになる。
判定可能な物体は天井、ドア、床、椅子、テーブル、壁、窓、その他、の8種類。
3.5でも距離と種類は取得できたのだが、APIが使いやすくなった。
「What'sOverThere」をApp Storeでhttps://t.co/4sayBYoHK2 @TachibanaKaoru さんの LIDARの SceneDetection を使って、物体までの距離と種類をしゃべってくれるアプリ #potatotips
— くまもʕ•͡וʔ (@kumamo_tone) 2020年7月10日
Face Tracking
TrueDepthカメラ搭載のみだったが、A12以上のプロセッサでも使えるようになった。(新しいiPhoneSEとか)
Reality Converter
Reality Converterというのが2020年1月にリリースされて、他のモデリングツールのファイルからUSDZファイルへ簡単に変換できるようになった。
次のiPhoneにLiDARが搭載されなかったらTachibanaさんのカシオミニがもらえます
[Android] license-list-pluginを使ってOSSライセンス画面を自動生成する / @syarihu
OSSライセンス画面を手軽に作るためのツール、いくつかある
- oss-licenses-plugin
- Google Play Services
- LicenseToolsPlugin
- license-list-plugin
- jmatsu <- new!
以下のような特徴がある。
- ライセンスリストを自動生成し、yamlに定義ファイルを出力人が読みやすい形なので、ライセンスの追加/変更/削除も簡単にできる
- oss-license-pluginと違いライセンスリストが隠蔽されていないため、差分も分かりやすい
- 定義ファイルを元に表示用のhtmlを自動生成したり、カスタマイズした画面を提供するために利用可能なjsonの出力も可能
- ローカルライブラリにも対応
- ライセンスリストから除外したいライブラリがある場合は.artifactignoreに記述することで簡単に除外可能
- cookpad/LicenseToolsPluginを使っている場合はcookpadのプラグインで利用するlicenses.ymlからの移行も可能
json だけでなく HTML の形式でも吐ける。従来のより見た目も良い。
Github Actions に組み込んで自動でライセンス定義を更新することもできる。
jmatsu/license-list-plugin: Gradle plugin to manage licenses of your Android app's dependencies.https://t.co/6TaBEfnfCm こんなのあったんだ よさそう Android で一昨年ぐらいにアプリ作ったときちょうどほしい感じのが見つからなかったんだよな #potatotips
— くまもʕ•͡וʔ (@kumamo_tone) 2020年7月10日
聞いた範囲たいへん良さそうだが This plugin is still under development. とのこと
[iOS] Speech framework tips / @tsuzuki817
note にセルフテキストまとめがあるので詳しくはこちら!
Apple純正の音声認識フレームワーク。ローカル(iOS13〜)とサーバー版がある。
サーバーのAPIの制限は1リクエスト60秒(音声の長さ)。1時間に1000回まで。
NSSpeechRecognitionUsageDescription と NSMicrophoneUsageDescription を Info.plist に入れて使う。
共有会って喋って認識させてみた結果。
通話中は録音ができないのでデバッグ時には注意。
[Flutter] Creating Flutter Animations with Rive
Rive は Flutterで使えるアニメーションツール。前まで flare という名前だった。ツール flr ファイルを読み込んで使うだけ。
フリー版でも機能が使えるが、作ったファイル public にしなければならない。 private にしたければ、 21ドル/月か、年間プランだと14ドル/月。
#potatotips RiveとLottie両方やったことあるデザイナーさんにどっちが作りやすいか聞きたい
— 所 友太 / Spinners Inc. (@tokorom) 2020年7月10日
iOSには対応しているけどAndroidには対応していない?(調べてない)
Androidはないのか…残念https://t.co/uWhYtoqwk2
— なべ (@NabeCott) 2020年7月10日
#potatotips
#potatotips おお、Riveの実行環境にSwiftも入ってるー https://t.co/UXER0btlLT
— 所 友太 / Spinners Inc. (@tokorom) 2020年7月10日
画面構成は必要そうなところが絞られててパッと見使いやすそうに見えた #potatotips
— くまもʕ•͡וʔ (@kumamo_tone) 2020年7月10日
[iOS] UICollectionView iOS14 / @shiz
iOS14 での UICollectionView の更新について。
SectionSnapShot
SectionSnapShot というのが追加された。セクションごとの折りたたみの状態を保存できたり、それのイベントハンドラがあったりする。
あと並び替えのサポートがされた。
Lists
UITableViewのような外見で、スワイプできる、デフォルトのレイアウトが用意されている、Compositional Layoutの上に作成できるなどの特徴がある。
Cell(View)の設定
struct で設定できるようになった。
いい感じに型を使ってセルの登録もできるようになった(これUITableViewにはないってことなのかな)
より深く理解したい人はAppleの公式サンプルコードがおすすめ。
Qiita にもまとめてくださっている。
[Android] getChangePayload in DiffUtil / @rmakiyama
音声版
本日の発表の音声版です!🚀#Radiotalk #ラジテクFM #potatotips https://t.co/E3zBkJrG5g
— まきやま (@_rmakiyama) 2020年7月10日
DiffUtil に getChangePayload というのがある。これはareItemsTheSameがtrueかつareContentsTheSameがfalseで呼ばれる。
変更に関するペイロードをオブジェクトで返せるので、細かい更新の制御が可能。画像の再読み込みが起こらずチラツキが起こらず、スマート。
Groupieにも同様の機能が提供されている。
サンプルコード
[iOS] Swift UIで勘違いした話 / @koher
Stepper に $counter.count を渡すように、 NumberDisplay にも @Binding の $counter.count を渡していたら、コンパイルエラーでうまくいかなかった
というのも、Stepperでは双方向バインディングなんだが、NumberDisplayは単方向バインディングなので、
Viewでは @Binding ではなくシンプルにプロパティを持っておいて、プロパティを渡せば 単方向バインディングは実現できるということがフォーラムに聞いたらわかった 質問するのは大事ですね
[Android] Material Components for Android 1.2.0 and 1.3.0 / @NabeCott
まだ開発中だが Material Components に入りそうな変更について。
SliderはSeekBarのMaterial Component版 目盛りの表示やTooltipの表示、範囲の選択などができる
ShapeableなImageViewなど
ほかにも複数行のタイトルが表示できるCollapsingToolbarやProgressBarのMaterial Component版、新しいTimePicker(In development)などが入りそう
[iOS] iOSアプリでWebRTC / @SatoHikaruDev
WebRTCのクライアント実装について理解を深めたい。
サンプルを参考に、どういう処理がされているのか見ていく。接続、SDPのやりとり、映像キャプチャなどについて実際のコードを交えて紹介。
WKWebViewはWebRTC未対応なんだ#potatotips
— ウホーイ (@the_uhooi) 2020年7月10日
[Android] Adaptive Cardsを使ってみた / @nakasho_dev
www.slideshare.net
Adaptive Cards は、JSONで作成された、プラットフォームに依存しないUIのスニペット。特定のアプリに配信されると、JSONは周囲に自動的に適応するネイティブUIに変換する。Microsoftが推進していて、 Android iOS JavaScript ASP.NET .NET WPF Windows ReactNative などで使えるもよう
Adaptive Card Designer というのがあって、ノンプログラマーでもいい感じに編集できる。
感想
前回に続きリモート開催だったが、運営さんの頑張りなどによって、なんだったらリモートのほうがいい面あるんではと思えるぐらい良い感じだった ありがとうございます