potatotips #70 に iOS ブログまとめ枠で参加させていただきました(Androidのもまとめました)。
今回はLINE Fukuokaさん主催で、Zoomのウェビナーを使ったオンラインでの開催となりました。
自分で見直すときのわかりやすさ重視でガッツリ元資料を引用していますが問題あればご連絡ください。
[iOS] Contributing to XcodeGen / @freddi
XcodeGen という YAMLでxcodeprojを管理できる OSS にコントリビュートした。
Swift Packageの依存が、Remoteにあるものしか解決できなかった。これをLocalでもできるようにした。
気をつけること、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 ")
pushStyle(SpanStyle(
fontSize = 40.sp,
fontSynthesis = FontSynthesis.All,
textDecoration = TextDecoration.Underline
append("$name!!")
pop()
Text(text =
greetingText, fontSize = 30.sp)
こうなる
テキスト内にカスタム画像を表示
inline content というのがある。
@Composable
fun StyledGreeting3(name: String){
val inlineContentId = "InlineContent"
val greetingText = annotatedString {
append("Hello $name!!")
appendInlineContent(id = inlineContentId, alternateText = ":droid:")
inlineContent: map<String, InlineTextContent> を Text に渡す
@Composable
fun StyledGreeting3(name: String) {
val inlineContentId = "InlineContent"
val greetingText =
val inlineContent = map0f(
inlineContentId to InlineTextContent(
Placeholder(
width = 30.sp,
height = 30.sp,
placeholderVerticalAlign = PlaceholderVerticalAlign.Center
){ alternateText ->
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
speakerdeck.com
ARKitの歴史
ARKit4 新機能を紹介していく。
Geo Anchor
AppleがMap情報を取得するときに収集した実際の建物の3D情報と、カメラ画像から分析した3D情報と、端末のGPS情報を組み合わせた仕組みで、非常に正確な位置測定が可能。
セカイカメラと同じようなことが簡単に実装できる。
現時点ではサンフランシスコ、シカゴ、マイアミ、ニューヨーク、ロサンゼルスだけで使える。
使い方
Depth with LIDAR (Scene Geometry with LIDAR?)
新しいiPad Pro だけで使える、センサーから光を照射してその反射光を使って物体までの距離や物体の種類がわかるようになる。
判定可能な物体は天井、ドア、床、椅子、テーブル、壁、窓、その他、の8種類。
3.5でも距離と種類は取得できたのだが、APIが使いやすくなった。
Face Tracking
TrueDepthカメラ搭載のみだったが、A12以上のプロセッサでも使えるようになった。(新しいiPhoneSEとか)
Reality Converter
Reality Converterというのが2020年1月にリリースされて、他のモデリングツールのファイルからUSDZファイルへ簡単に変換できるようになった。
次のiPhoneにLiDARが搭載されなかったらTachibanaさんのカシオミニがもらえます
[Android] license-list-pluginを使ってOSSライセンス画面を自動生成する / @syarihu
speakerdeck.com
OSSライセンス画面を手軽に作るためのツール、いくつかある
- oss-licenses-plugin
- LicenseToolsPlugin
- license-list-plugin
github.com
以下のような特徴がある。
- ライセンスリストを自動生成し、yamlに定義ファイルを出力人が読みやすい形なので、ライセンスの追加/変更/削除も簡単にできる
- oss-license-pluginと違いライセンスリストが隠蔽されていないため、差分も分かりやすい
- 定義ファイルを元に表示用のhtmlを自動生成したり、カスタマイズした画面を提供するために利用可能なjsonの出力も可能
- ローカルライブラリにも対応
- ライセンスリストから除外したいライブラリがある場合は.artifactignoreに記述することで簡単に除外可能
- cookpad/LicenseToolsPluginを使っている場合はcookpadのプラグインで利用するlicenses.ymlからの移行も可能
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 に入れて使う。
共有会って喋って認識させてみた結果。
通話中は録音ができないのでデバッグ時には注意。
[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
SectionSnapShot というのが追加された。セクションごとの折りたたみの状態を保存できたり、それのイベントハンドラがあったりする。
あと並び替えのサポートがされた。
Lists
UITableViewのような外見で、スワイプできる、デフォルトのレイアウトが用意されている、Compositional Layoutの上に作成できるなどの特徴がある。
Cell(View)の設定
struct で設定できるようになった。
いい感じに型を使ってセルの登録もできるようになった(これUITableViewにはないってことなのかな)
より深く理解したい人はAppleの公式サンプルコードがおすすめ。
Qiita にもまとめてくださっている。
qiita.com
[Android] getChangePayload in DiffUtil / @rmakiyama
speakerdeck.com
音声版
DiffUtil に getChangePayload というのがある。これはareItemsTheSameがtrueかつareContentsTheSameがfalseで呼ばれる。
変更に関するペイロードをオブジェクトで返せるので、細かい更新の制御が可能。画像の再読み込みが起こらずチラツキが起こらず、スマート。
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 に入りそうな変更について。
SliderはSeekBarのMaterial Component版 目盛りの表示やTooltipの表示、範囲の選択などができる
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 というのがあって、ノンプログラマーでもいい感じに編集できる。
感想
前回に続きリモート開催だったが、運営さんの頑張りなどによって、なんだったらリモートのほうがいい面あるんではと思えるぐらい良い感じだった ありがとうございます