Upgrade to Pro — share decks privately, control downloads, hide ads and more …

同じ様なUIをiOS/Android間で合わせるヒント

Fumiya Sakai
December 13, 2023

 同じ様なUIをiOS/Android間で合わせるヒント

Re: 2023 モバイルアプリ開発 LT大会 #AppBrew & Swift愛好会#78での登壇資料になります。

今回はiOS/Android間で類似した様な実装を進めていく上で、いくつかの実例を元にしてiOS/Android両方を効率良く進めるための観点・ヒントや着想を得るポイントとなり得る部分に関して簡単に紹介できればと思います。

現在もまたiOS/Androidを並行して業務する機会が増えてきたことや、Swift/Kotlin/Dartへの理解を深める際に、これまで取り組んできたiOS関連の個人的取り組みやノートテイキングでの基本事項インプットで培ってきた事項がとても役に立ちました。その中でも個人開発や業務でも役に立ったものを簡単ながら紹介しています。

※過去の登壇内容も参考にして頂けると幸いです。

● 少しずつキャッチアップしていくAndroidアプリ開発
https://www.slideshare.net/fumiyasakai37/android-239074927

● iOS側のUIの特徴と見比べるAndroid側でのUI実装のヒント
https://www.slideshare.net/fumiyasakai37/iosui-androidui

● 僕が業務で初めてAndroidアプリ開発に着手して2ヶ月程経過した中での振り返り
https://note.com/fumiyasac/n/nec1c3c80f12d

● Androidアプリ開発やFlutterの基礎学習をノートと一緒に振り返る
https://note.com/fumiyasac/n/n0acb2bd76b64

Fumiya Sakai

December 13, 2023
Tweet

More Decks by Fumiya Sakai

Other Decks in Technology

Transcript

  1. 自己紹介 ・Fumiya Sakai ・Mobile Application Engineer アカウント: ・Twitter: https://twitter.com/fumiyasac ・Facebook:

    https://www.facebook.com/fumiya.sakai.37 ・Github: https://github.com/fumiyasac ・Qiita: https://qiita.com/fumiyasac@github 発表者: ・Born on September 21, 1984 これまでの歩み: Web Designer 2008 ~ 2010 Web Engineer 2012 ~ 2016 App Engineer 2017 ~ Now iOS / Android / sometimes Flutter
  2. この様な画面実装を題材として処理を考えてみます 検索結果画面表示の中に広告作品を一定の規則性を持たせて表示する場合 検索結果 … 広告結果 … この画面での表示規則: 検索結果表示内に広告が ミックスされた形になる。 1.検索結果は4行2列で並ぶ

    2.広告結果は1行2列で並ぶ 必ず規則が担保できるか? 1ページあたりの最大数: 1.検索結果は32件表示 2.広告結果は8件表示 ① 検索結果32件/広告結果5件: (1)広告結果<検索結果÷4 or (2)広告結果+検索結果=(奇数) の場合 ② 検索結果9件/広告結果3件: UICollectionViewやRecyclerViewのでの並び順を実現する際に綺麗 に見せるための調整が必要になる場合もある。 検索結果画面は表示処理時にページネーションを伴う場合が多い。 1.ページの終端に到達した場合 2.検索結果は少ないが広告結果が多く取得できた場合 実装時に考慮したいポイントと考え方: Array<T>やList<T>で表示対象データを調整しやすい形にしたい iOSのDiffableDataSourceを組み立てる様にAndroid側も整えたい
  3. 表示対象のDataSourceに対する処理方針を決定する 検索結果と広告結果を上手に分割&マージをして調節する処理がポイント Cell要素 or ViewHolder要素1つ分に表示したいデータを準備する際の考え方: (1) 現在検索結果に表示される作品が広告結果を含めて奇数個の場合には、検索結果作品を1つ埋める処理をして、 できるだけ広告結果が1行2列に並ぶ配慮をする 条件に合致した場合は、Nページ当たりの検索結果を格納する配列から先頭要素を取得&削除を実行し、その要素を並べ替え結 果を格納する配列の先頭に追加する。

    (2) 1行2列広告作品、その次に4行2列検索結果作品、以降繰り返しとなる様に対象データを分割する 1.検索結果配列:[[検索結果8個分], [検索結果8個分], ... ] 2.広告結果配列:[[広告結果2個分], [広告結果2個分], ... ] 3.1.&2.で求めた結果でchunkedした組の個数が多い方を全体のLoop処理回数に設定する (3) 最大Loop回数の1行2列広告作品、その次に4行2列検索結果作品を追加するための処理を実行する
  4. 題意を満たす並び順を実現する処理部分の抜粋 取得できたデータに対してchunk処理を利用した後に表示データへ変換する chunkedSearchProductsGroup .getOrNull(loopIndex)?.let { … 追加処理 … } (Kotlin)

    chunked(size: Int): https://kotlinlang.org/api/latest/jvm/ stdlib/kotlin.collections/chunked.html Kotlinの場合は下記の様になる: Swift ⇔ Kotlin内で内部処理ロジックを読み替えられそうな余地を探す chunk処理がこの表示をするポイント: (Swift) chunks(ofCount: Int): Array要素を指定個数のかたまり分割する
  5. Paging3やOnScrollListenerを利用したPaginationの例 AndroidではPaging3利用 or OnScrollListenerを応用する方針を取る OnScrollListener スクロールの最下部へ到 達した際に次のデータを 読み込む処理を実行。 Paging3を理解するための資料集: iOS(UIKit想定時):

    実践Paging 3: https://speakerdeck.com/ticktaku77/shi-jian-paging-3 Flow APIとPaging3を考える際のポイント例: https://github.com/zivkesten/Paging-with-Flow-sample-app スクロール変化や該当Cell出現をキャッチする - UIScrollViewDelegate - UITableViewDelegate / UICollectionViewDelegate func scrollViewDidScroll(_ scrollView: UIScrollView) func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath)
  6. Shared Element Transitionを利用した画面遷移の例 画面遷移元と遷移先のxmlに同じtransitionNameを指定しIntentを発行する方針 一覧用View画面 詳細用View画面 transitionName = robot transitionName

    = robot 画面遷移時のIntent発行タイミングで文字列を引き渡す ① .makeSceneTransitionAnimationを利用する点がポイント ② Animation対象の要素についてはPair.createで複数指定可 ※下記はActivityのxmlを指定している場合のコードです
  7. これまでのiOS/Android関連の登壇資料&記事紹介 Androidアプリ開発を始めた頃にまとめたものですが今も役立っています 僕が業務で初めてAndroidアプリ開発に着手して2ヶ月程経過した中での振り返り: https://note.com/fumiyasac/n/nec1c3c80f12d Androidアプリ開発やFlutterの基礎学習をノートと一緒に振り返る: https://note.com/fumiyasac/n/n0acb2bd76b64 Qiita記事 パンフ原稿 登壇資料 note記事

    note記事 Androidアプリでバックグラウンド再生機能を実現するためのヒントとiOSアプリとの見比 べた際の特徴を簡単にまとめてみた: https://qiita.com/fumiyasac@github/items/2f698d6c330530338826 円滑なUI&機能実装やデザイナーとの共同作業を進めるために心がけてきた事: https://github.com/fumiyasac/iosdc2021_pamphlet_manuscript/blob/main/manuscript.md iOS側のUIの特徴と見比べるAndroid側でのUI実装のヒント: https://www.slideshare.net/fumiyasakai37/iosui-androidui
  8. まとめ iOS/Androidの両方を実装を見比べて見ると、実はそう遠くない部分もある 今後ともメインはiOSに置きながらもAndroidについてもアウトプットができる様に頑張ります。 1. 言語・コンポーネント・アーキテクチャの違い等はあるけど類似点・共通点を探してみる: 実装のイメージが類似している場合には実装方針を見抜くチャンスと捉える様にしています。個人的にはこれまでの経験の中か ら「実装のテイストが似ている部分」を見つけ出す様にするために、現在は両方進んでコードを読む様にしています。 2. iOS/Android間で明らかに考え方が異なる部分は念入りに仕様調査をする: 以前の業務でも苦戦した部分はDIコンテナ関連処理と動画再生関連部分でした。両方進んでコードを読み進めていく際に、考え

    方が大きく異なる部分については、サンプル実装をしているOSS等をヒントに基本理解を進める様にしています。 3. 業務で活用しているGraphQLの利用も個人的には大きな後押しになっている: GraphQLやApolloを業務内で活用している事に加えて、最近では積極的にRailsコードも読む機会が増えました。サーバーとの通 信部分等を一緒に考える余地を増やしていく様にする事で、より生産性を高めてスピードアップにも繋がると考えています。