SlideShare a Scribd company logo
SwiftとReactNativeで
似たようなUIを作った際の記録
2017/10/20
iOSDCRC day2 @ LODGE (Yahoo! JAPAN)
Fumiya Sakai
自己紹介
・酒井 文也 (Fumiya Sakai)
・ever sense. inc エンジニア
・Designer → ServerSide Engineer → AppDeveloper
Accounts
・Facebook: https://www.facebook.com/fumiya.sakai.37
・Twitter: https://twitter.com/fumiyasac
・Github: https://github.com/fumiyasac
・Qiita: https://qiita.com/fumiyasac@github
Who are you?
Library (Personal)
Products (ever sense. inc)
祝!リニューアル
ReactNativeでUI構築の際に押さえておきたいポイント
SwiftからReactNativeに来た際に個人的に戸惑ったところ
その1. 遷移の管理と実装
その2. UI部品に関する考え方と実装について
その3. iOS / Androidでのクロスプラットフォームの対応
その他気をつけると良いトピックス
・Reduxの考え方
・UIComponentのライフサイクル
・データ永続化
その1. 遷移の管理と実装
ReactNativeはStoryboardがなく、遷移の実装は明確に違いが出る所
Swift ReactNative
・Storyboard & Segue
・push / pop (with UINavigationController)
・present / dismiss
・カスタムトランジション
・NavigatorIOS (iOS only)
・Redux & react-navigation
・Mobx
・参考資料(Mobx): React Native with MobX — Getting Started
https://medium.com/react-native-training/react-native-with-mobx-getting-started-ba7e18d8ff44
・react-native-router-flux
・参考資料(Redux & react-navigation): redux + react-navigation
https://qiita.com/kazuyuka76/items/6295e5ee282e5ba494a1
・参考資料(react-native-router-fluxのリポジトリ): ※次ページに使用方法を解説
https://github.com/aksonov/react-native-router-flux
例. react-native-router-fluxに関する解説
元になるComponentクラス(App.js等)に対応を記載してActionsを発火させる
※ 遷移の設計はSwiftでもReactNativeでも重要な部分
Reduxにどこまでロックインさせるかは要件次第
各コンテンツ用のコンポーネントクラス
との対応を記載しておく。
※ react-native-router-fluxは特にReduxを使わない
  場合でも使用可能です。
各コンテンツ用のコンポーネントの中で、
進む:Actions.key名({ param1: xxx, … }) / 戻る: Actions.pop()
をonPress内に記載する。
・direction指定なし → push / pop
・direction=”vertical” → present / dismiss
その2. UI部品に関する考え方と実装
Storyboard・XibはないがWebのフロントエンド構築にイメージが近い印象
Swift ReactNative
・Storyboard & Xib
・UIViewController
・AutoLayout
・UIComponent
・Flexbox
・参考資料2: React Nativeを用いた初めてのiOSアプリ開発 : 選んだ理由と、開発で学んだこと
http://postd.cc/react-native-ios-app/
・参考資料1: ReactNativeのデバッグ方法
https://qiita.com/y_koh/items/3f2090e450269bc9f07c
→ 左に挙げたような見える場所やControllerがない
・HTML + CSSやAndroidのXMLでのレイアウト作成に近い
・見た目のデバッグはCmd + RやChrome Developer Tool使用
・Viewの重なりの順番が関わる際は少しわかりにくさも...
・Storyboard & Xibを活用して見た目を確認しながら調整
・Storyboard & XibやAutoLayoutでUI側のコードを追い出す
・Viewの重なりの順番が目でわかりやすい
例1. 横方向にスライドするコンテンツがあるUI実装
横方向に一覧表示がされていて、縦方向に別のカテゴリの一覧を持つ
作成中のサンプル 実装のポイント
UITableViewCell + UICollectionView
ScrollView + FlatList
※今回のケースはサードパーティー製ライブラリは
 使わない想定のものになります。
・FlatListはReactNative Ver0.43より追加
・iOSのUICollectionViewやAndroidのRecyclerViewに近しい
例. NETFLIX
Swift
ReactNative
※ReactNativeのScrollView, SectionList, FlatListは
 SwiftのUIScrollView, TableView, CollectionView
 同様に開発でよく使うもの
例1. 横方向にスライドするコンテンツがあるUI実装
Swift及びReactNativeでのこのUI実装の組み立て方と設計
要素に分解
NavigationBar
(ポイント)UITableViewCell内にUICollectionViewを持つSwift
ReactNative
UITableView
UITableViewCell UICollectionView
View(Header相当) ScrollView
View(ScrollViewの中) FlatList
(ポイント)ScrollView内のViewにFlatListを展開
・参考資料2: FlatList (ReactNative official document)
https://facebook.github.io/react-native/docs/flatlist.html
・参考資料1: How to use the FlatList Component — React Native Basics
https://medium.com/react-native-development/how-to-use-the-flatlist-component-react-native-basics-92c482816fe6
例2. メディアアプリであるような感じのUI実装
スクロールの位置の変化に応じてメイン画像やナビゲーションが動く
y = 0
実装のポイント
※今回のケースはサードパーティー製ライブラリ使 用
します。(ReactNative Ver0.48.3にて検証)
・使用ライブラリ:react-native-parallax-scroll-view
https://github.com/i6mi6/react-native-parallax-scroll-view
作成中のサンプル
ScrollViewDelegate + ダミーのHeader
パララックス表示のライブラリ
Swift
ReactNative
y < 0 y > 0
記事を表示するために下へスクロールすると画像が隠
れるタイミングに合わせてNavigationBarが出現
※ReactNativeのアニメーションはiOSのアニメー
 ションとはかなり異なる部分(結構つらい...)
その3. iOS / Androidでのクロスプラットフォーム対応
iOS / Android間のアプリデザインの考え方による違いをどう埋めるか?
iOS Android
iOS Human Interface Guideline
https://developer.apple.com/ios/human-interface-g
uidelines/overview/themes/
Material Design
https://material.io/guidelines/
・Developing for Android vs. iOS: Material vs. Flat Design
https://medium.com/@jrejaud/developing-for-android-vs-ios-material-vs-flat-design
-fb341b05b0f0
一方でデバイスでデザインが異なるUIパーツでは用意されていないものもある
例)Header / Icon / ListView (UITableView) / Drawer / Spinner …
・xxx.ios.js / xxx.android.js とデバイス毎にデザインを分ける?
・両者のガイドラインの良いとこ取りをしたデザインにする?
デザイン的に両者の違いをどのようにして解決するか?
ReactNative純正のUIComponetでもAlertやProgressBar等は用意されている
https://facebook.github.io/react-native/docs/getting-started.html
iOS
Android
ヘッダーの違い
例. よりネイティブアプリに近いUIをつくるもの
iOS / Androidのデザイン間の差異を良い感じでよしなにするもの
・参考資料:
NativeBaseをはじめとするUI関連のライブラリを活用してReactNativeでUIサンプルを作成した際の詳細解説
https://qiita.com/fumiyasac@github/items/12707f93f5c96fa3fc3f
NativeBase(ReactNativeのUIComponentを拡張してつくられている & ReactNative純正UIComponentと併用可)
UI Component Library参考:(iOS)
https://akveo.github.io/react-native-ui-kitten/#/home
UI Component Library参考:(Android)
http://react-native-material-design.github.io/
1つのコードでネイティブに近いデザインにできるメリット
デメリット スタイルの細かい微調整がしにくい場合がある
・公式ページ:https://nativebase.io/
・サンプル(KitchenSink)https://github.com/GeekyAnts/NativeBase-KitchenSink
公式ページの「Docs」内に実装例とデバイス毎の見た目例があります。
注意1:UI Component Libraryは併用しないように!
注意2:ライブラリでも難しい部分は自作するように!
その他気をつけると良いトピックス
Swiftでアプリ開発をする方がReactNativeを始める際に知っておくと良いもの
UIComponentのライフサイクル
Reduxの考え方
データ永続化
UIComponetクラスもライフサイクルを持つ。
iOS / Androidのネイティブのものとは異なるので注意!
・React component ライフサイクル図
https://qiita.com/kawachi/items/092bfc281f88e3a6e456
・iOSエンジニア必見!!iOSのレイアウトで押さえておきたいこと【総集編】
https://developers.eure.jp/tech/ios_layout_beginners/
アプリの状態管理をAction → Dispatcher → Store →
View の流れで1方向になるようにするArchitecture。
Swiftのライブラリでも「ReSwift」がある。
・Reduxの基本
http://developers.mobage.jp/blog/redux-basic
・ReSwift
https://github.com/ReSwift/ReSwift
データ永続化に関してもネイティブiOS同様様々
特にRealmが使用できるのは個人的に嬉しい。
・React Nativeにおけるローカルデータベースの考察
https://goo.gl/w4xHsh
・Realm (Javascript)
https://realm.io/docs/javascript/latest/
まとめ
UI実装に関してSwiftとReactNativeを比べると同じようでも違う部分が多い
UIの考え方がネイティブとかなり異なる部分があるが、近い UIを実現することは十分に可能
クロスプラットフォームならでは iOS / Android間のデザイン差異も考慮に入れる
アプリと相性を考える
※今回の資料のQiita詳細解説及びSwift版・ReactNative版は追って公開します(11月上旬見込み)
・UIComponentやライブラリ等をうまく活用することで良いUIが実現できる ※Animationは少し苦手
・遷移の考え方やUI構築の方法ががらりと異なる箇所もあるのでこの部分は注意が必要
・サーバーサイドが動きや振る舞いを決めてクライアントがそれに準ずるものなら相性は良いと思う。
・端末の機能をフル活用するもの(アプリ内課金・エクステンション・地図等)は結構大変になりそうな印象。
・iOS / Android両対応アプリを開発する際は、両者のデザインやUIの考え方を考慮すること
・デザインの差異が出やすいUIパーツの考慮を忘れずにすると良い
エバーセンスよりメッセージ
※お詫び:弊社はReactNativeでリリースしているプロダクトはありません。。。
弊社では現在、
「iOS / Androidエンジニア」
募集中です!
https://www.wantedly.com/projects/158484

More Related Content

PPTX
「DNS浸透いうな」と言うけれど… (#ssmjp 2018/07)
PDF
macOSの仮想化技術について ~Virtualization-rs Rust bindings for virtualization.framework ~
PDF
クラウド時代だからSpring-Retryフレームワーク
PPTX
reduxのstate設計の話
PPTX
Spring Boot ユーザの方のための Quarkus 入門
PDF
自宅vSphereからニフクラに引っ越ししてみた
PPTX
CEDEC2021 Android iOS 実機上での自動テストをより楽に有意義にする為に ~端末管理・イメージ転送・動画記録等の周辺情報のノウハウ共有~
PDF
Software design as a cooperative game with EventStorming
「DNS浸透いうな」と言うけれど… (#ssmjp 2018/07)
macOSの仮想化技術について ~Virtualization-rs Rust bindings for virtualization.framework ~
クラウド時代だからSpring-Retryフレームワーク
reduxのstate設計の話
Spring Boot ユーザの方のための Quarkus 入門
自宅vSphereからニフクラに引っ越ししてみた
CEDEC2021 Android iOS 実機上での自動テストをより楽に有意義にする為に ~端末管理・イメージ転送・動画記録等の周辺情報のノウハウ共有~
Software design as a cooperative game with EventStorming

What's hot (20)

PDF
【Unite Tokyo 2018】その最適化、本当に最適ですか!? ~正しい最適化を行うためのテクニック~
PDF
Junitを使ったjavaのテスト入門
PPTX
俺と Active Storage + CloudFront
PPTX
A frameハンズオン 20170129
PDF
不揮発メモリ(NVDIMM)とLinuxの対応動向について
PDF
ドキュメンテーションを加速するストレスフリーの作図ツール『blockdiag』 jus2011年6月勉強会
PPTX
Goで実装した UPSIDERの決済金額リミット機能
PDF
Raspberry Pi + Go で IoT した話
PDF
技術広報ってどんな仕事で、どんな能力があるといいの
PDF
ワンクリックデプロイ 〜いつまで手でデプロイしてるんですか〜 #devsumiA
PPTX
Yocto bspを作ってみた
PDF
ドメイン駆動設計サンプルコードの徹底解説
PDF
Apache NiFi の紹介 #streamctjp
PDF
Java EE から Quarkus による開発への移行について
PDF
Lean coffee
PDF
今更ながらの「マイクロサービス」
PDF
DMM GAMES 内製チーム PlayCanvas 上でのアーキテクチャ、デザインパターン
PDF
TwilioとLINEとSlackを繫いで、電話の伝言メッセージをLINEとSlackで確認する+音声認識+メール
PPTX
VyOSの開発とか運用の話
PDF
2022_sakura-yube_ddd.pdf
【Unite Tokyo 2018】その最適化、本当に最適ですか!? ~正しい最適化を行うためのテクニック~
Junitを使ったjavaのテスト入門
俺と Active Storage + CloudFront
A frameハンズオン 20170129
不揮発メモリ(NVDIMM)とLinuxの対応動向について
ドキュメンテーションを加速するストレスフリーの作図ツール『blockdiag』 jus2011年6月勉強会
Goで実装した UPSIDERの決済金額リミット機能
Raspberry Pi + Go で IoT した話
技術広報ってどんな仕事で、どんな能力があるといいの
ワンクリックデプロイ 〜いつまで手でデプロイしてるんですか〜 #devsumiA
Yocto bspを作ってみた
ドメイン駆動設計サンプルコードの徹底解説
Apache NiFi の紹介 #streamctjp
Java EE から Quarkus による開発への移行について
Lean coffee
今更ながらの「マイクロサービス」
DMM GAMES 内製チーム PlayCanvas 上でのアーキテクチャ、デザインパターン
TwilioとLINEとSlackを繫いで、電話の伝言メッセージをLINEとSlackで確認する+音声認識+メール
VyOSの開発とか運用の話
2022_sakura-yube_ddd.pdf
Ad

Viewers also liked (19)

PDF
自分のライブラリを1年運用をして見た振り返りと知見
PDF
第7回こども病院移転計画調査委員会資料
PDF
東京から沖縄に移住したからこそわかるクラウドとコミュニティの有り難み 〜人はもっと自由になれる〜
PDF
先取り!PHP 7 と WordPress
PPTX
【ハンズオン】初めてのUnityで作る「3D野球盤」_"8a1"20150204発表資料
 
PDF
Laravelのeloquent だけ入れた話
PPTX
PSR-1 と PSR-2 を 5分でざっくり理解する
PDF
NetBeans、FuelPHP と過ごしたこの 2 ヶ月
KEY
Composer による依存管理 と Packagist によるライブラリの公開
PDF
traitを使って楽したい話
PDF
Play jjug2012spring
PDF
Twilio を使えば簡単にできる アプリケーションと電話/SMS連携
PDF
新標準PSRに学ぶきれいなPHP
PPTX
はじめて作ったアプリが10,000ダウンロード達成したから自慢する
PDF
DMMの闇に触れた話
PDF
Trait とは? その使い道を考えてみる
PDF
レイヤードアーキテクチャを意識した PHPアプリケーションの構築 ver2
PDF
Docker ComposeでMastodonが必要なものを梱包する話
PDF
コンテンツ作りの三原則
自分のライブラリを1年運用をして見た振り返りと知見
第7回こども病院移転計画調査委員会資料
東京から沖縄に移住したからこそわかるクラウドとコミュニティの有り難み 〜人はもっと自由になれる〜
先取り!PHP 7 と WordPress
【ハンズオン】初めてのUnityで作る「3D野球盤」_"8a1"20150204発表資料
 
Laravelのeloquent だけ入れた話
PSR-1 と PSR-2 を 5分でざっくり理解する
NetBeans、FuelPHP と過ごしたこの 2 ヶ月
Composer による依存管理 と Packagist によるライブラリの公開
traitを使って楽したい話
Play jjug2012spring
Twilio を使えば簡単にできる アプリケーションと電話/SMS連携
新標準PSRに学ぶきれいなPHP
はじめて作ったアプリが10,000ダウンロード達成したから自慢する
DMMの闇に触れた話
Trait とは? その使い道を考えてみる
レイヤードアーキテクチャを意識した PHPアプリケーションの構築 ver2
Docker ComposeでMastodonが必要なものを梱包する話
コンテンツ作りの三原則
Ad

Similar to SwiftとReactNativeで似たようなUIを作った際の記録 (20)

PDF
Fundamentals of Swift & Redux (ReduxとSwiftの組み合わせ)
PDF
React Native 入門
PDF
ReactNative + Redux + NativeBaseでつくるサンプル実装をのぞく
PDF
React Nativeで開発するマルチプラットフォームアプリ
PDF
iOSアプリUIとの触れ合いと歩む僕なりのSwiftの楽しみ方
PDF
ReduxとSwiftの組み合わせ:改訂版
PPTX
React Nativeで考えるクロスプラットフォーム開発
PDF
RxSwiftとMVVMパターンと仲良くなる次のステップ
PDF
デザイナー→Webエンジニア→iOSエンジニアと渡り歩いた僕なりのSwiftとの向き合い方と生かす戦略
PDF
iOS 9 Overview - iOS 9 Bootcamp in Tokyo - 20150930
PDF
SwiftUIで本のUIにチャレンジしてみた!potatotips #87 iOS/Android開発Tips共有会 ...
PDF
Go言語で色々試行錯誤して フレームワークもどきを作ってみた話
PDF
iOSアプリで気になった動きや表現を上手にアレンジして活用してみる
PDF
部品に切り分けて考えるView構造とライブラリを上手に活用したUI実装
PPTX
社内LTネタ ReactNative
PDF
エンジニアリングするデザイナーが領域を超えて見えたこと
PDF
エンジニアリングするデザイナーが領域を超えて見えたこと
PDF
Approach of Prototyping for making Application User Interface about iOS
PDF
UI&UX / 重要なのは、毎日さわって嬉しい UI UX!
PPTX
iPhoneアプリ開発の歩き方〜Swift編〜
Fundamentals of Swift & Redux (ReduxとSwiftの組み合わせ)
React Native 入門
ReactNative + Redux + NativeBaseでつくるサンプル実装をのぞく
React Nativeで開発するマルチプラットフォームアプリ
iOSアプリUIとの触れ合いと歩む僕なりのSwiftの楽しみ方
ReduxとSwiftの組み合わせ:改訂版
React Nativeで考えるクロスプラットフォーム開発
RxSwiftとMVVMパターンと仲良くなる次のステップ
デザイナー→Webエンジニア→iOSエンジニアと渡り歩いた僕なりのSwiftとの向き合い方と生かす戦略
iOS 9 Overview - iOS 9 Bootcamp in Tokyo - 20150930
SwiftUIで本のUIにチャレンジしてみた!potatotips #87 iOS/Android開発Tips共有会 ...
Go言語で色々試行錯誤して フレームワークもどきを作ってみた話
iOSアプリで気になった動きや表現を上手にアレンジして活用してみる
部品に切り分けて考えるView構造とライブラリを上手に活用したUI実装
社内LTネタ ReactNative
エンジニアリングするデザイナーが領域を超えて見えたこと
エンジニアリングするデザイナーが領域を超えて見えたこと
Approach of Prototyping for making Application User Interface about iOS
UI&UX / 重要なのは、毎日さわって嬉しい UI UX!
iPhoneアプリ開発の歩き方〜Swift編〜

More from Fumiya Sakai (20)

PDF
RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介
PDF
iOS側のUIの特徴と見比べるAndroid側でのUI実装のヒント
PDF
少しずつ手厚くして不具合や仕様漏れを防ぐために
PDF
Measures for Growth with Firebase Remote Config & Unit Testing Using RxSwift
PDF
2022年の抱負とここ数年続けてきたインプット
PDF
既存プロジェクトで使っていたDIをお引っ越し&DIYすることになった
PDF
動画プレイヤーアプリの開発を通じて学んだ機能を実現するための要点解説
PDF
UI実装に関するセッションを 簡単ながら振り返ってみる(仮)
PDF
最近の業務やAndroid関連のインプットと振り返り
PDF
少しずつキャッチアップしていくAndroidアプリ開発の補足と振り返り
PDF
少しずつキャッチアップしていくAndroidアプリ開発
PDF
UIKitやSwiftUIで表現や動きが特徴的なUI実装事例を考察する
PDF
レイヤー分けをしたアーキテクチャで作るiOSアプリ&バックエンドのサンプル実装をのぞく
PDF
iOSアプリ開発で意識すると役立ちそうな「つなぎ目」の部分について
PDF
試して感覚を掴んでみるUICollectionViewCompositionalLayout & Combine
PDF
何故に私達(特に私)はアプリのアニメーションや UI表現に魅了されるのか? そして共存と向き合いを考える
PDF
アプリ開発におけるテキスト装飾のアイデア集
PDF
ライブラリやView構造を有効活用して iOSアプリのUIをオシャレにするワザ紹介
PDF
UI表現ライブラリを有効活用して iOSアプリのUIをオシャレにするワザ紹介
PDF
Hint of“Passcode Lock”Screen and Logic (with LocalAuthentication).
RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介
iOS側のUIの特徴と見比べるAndroid側でのUI実装のヒント
少しずつ手厚くして不具合や仕様漏れを防ぐために
Measures for Growth with Firebase Remote Config & Unit Testing Using RxSwift
2022年の抱負とここ数年続けてきたインプット
既存プロジェクトで使っていたDIをお引っ越し&DIYすることになった
動画プレイヤーアプリの開発を通じて学んだ機能を実現するための要点解説
UI実装に関するセッションを 簡単ながら振り返ってみる(仮)
最近の業務やAndroid関連のインプットと振り返り
少しずつキャッチアップしていくAndroidアプリ開発の補足と振り返り
少しずつキャッチアップしていくAndroidアプリ開発
UIKitやSwiftUIで表現や動きが特徴的なUI実装事例を考察する
レイヤー分けをしたアーキテクチャで作るiOSアプリ&バックエンドのサンプル実装をのぞく
iOSアプリ開発で意識すると役立ちそうな「つなぎ目」の部分について
試して感覚を掴んでみるUICollectionViewCompositionalLayout & Combine
何故に私達(特に私)はアプリのアニメーションや UI表現に魅了されるのか? そして共存と向き合いを考える
アプリ開発におけるテキスト装飾のアイデア集
ライブラリやView構造を有効活用して iOSアプリのUIをオシャレにするワザ紹介
UI表現ライブラリを有効活用して iOSアプリのUIをオシャレにするワザ紹介
Hint of“Passcode Lock”Screen and Logic (with LocalAuthentication).

SwiftとReactNativeで似たようなUIを作った際の記録