DMM.com Advent Calendar 2018 21日目を担当します、 @mii-chang です![]()
2018年新卒入社して、電子チケットのアプリを開発しています。
学生時代は主にAndroidアプリの開発をしていたのですが、入社してからはiOSの開発にも関わるようになりました。
はじめに
iOSの開発に関わるにあたり、ざっと理解を深めるために、色々と調べていましたが、
なんとなく、今までiOSをやっていた人がAndroidを始める話は多く見つかるが、その逆のAndroidをやっていた人がiOSを始める話があまり見当たらなかったような気がしました。
AndroidのアレみたいなのをiOSで実装したいんだけど!どうしたら!という場面が結構あって困ったので、
今更感はありますが、私が今まででiOSでどう実装するのか困ったもの、使ってみて便利だったものなどをまとめてみようと思いました![]()
クロスプラットフォームな感じがイマドキっぽいですが、ネイティブアプリもまだまだたくさん作られていると思うので…新しくiOSを始める人に少しでも役立てれば嬉しいです…!
基礎名称編
Activity
iOSでは
ざっくり理解としては、iOSではViewControllerがAndroidのActivityと同じような働きを持っています。画面操作ができるものです。
ここは、MVCだとかMVPだとかMVVMだとか話し出すと長くなってしまいそうなので、ここまでにとどめておきます。
ライフサイクル編
AndroidとiOSのライフサイクルを比べたとき、だいたい近い動きをしているなという箇所をまとめました。
完全に一緒ではないので、注意です。
onCerate
Activityが初めて生成されたタイミングでなにかしたいとき、AndroidならばonCreate内で処理を行います。
iOSでは
loadViewとviewDidLoadがだいたいonCreateに近い動きをしています。
loadViewは、Viewを読み込むときに呼ばれ、
viewDidLoadはloadViewが呼ばれた後に1度だけ呼ばれます。
onResume
Avtivityが表示されたタイミングでなにかしたいとき、AndroidならばonResume内で処理を行います。
iOSでは
viewWillAppearとviewDidAppearがだいたいonResumeに近い動きをしています。
viewWillAppearは、Viewが表示される直前に呼ばれます。
viewDidAppearは、Viewが表示された直後に呼ばれます。
onPause
別のActivityが呼ばれたタイミングでなにかしたいとき、AndroidならばonPause内で処理を行います。
iOSでは
viewWillDisappearがだいたいonPauseに近い動きをしています。
viewWillDisappearは、Viewが非表示になる直前に呼ばれます。
onStop
別のActivityが非表示になったタイミングでなにかしたいとき、AndroidならばonStop内で処理を行います。
iOSでは
viewDidDisappearがだいたいonStopに近い動きをしています。
viewDidDisappearは、Viewが非表示になった直後に呼ばれます。
onDestroy
Activityが破棄されたタイミングでなにかしたいとき、AndroidならばonDestroy内で処理を行います。
iOSでは
Androidで言うActivityの破棄系の処理(onPause~onDestroy)を、viewWillDisappearとviewDidDisappearが行っています。onDestroyっぽい、破棄されたタイミング、という分類で考えると、該当するものはない?かもでした。
Viewが非表示になるときには、viewWillDisappear→viewDidDisappearと呼ばれるということがわかればOKかな?
iOSのライフサイクルを理解する上でスーパー役に立った記事はこちらです。
UI編
レイアウト系
ConstraintLayout
Androidで相対的な位置関係で制約をつけてViewを組みたいときはConstraintLayoutを使います。
iOSでは
AutoLayoutを使います。
Androidと同じように、各View同士に制約(constraint)をつけて行きます。
LinearLayout
Androidで縦か横一列にViewを並べたいときは、LinearLayoutを使います。
iOSでは
StackViewを使います。
LinearLayoutのように縦か横一列にViewを並べることができ、この中のView同士に制約をつけることもできます。
Android的に言うと、LinearLayoutが親で、子にConstraintLayoutが入っているような状態です。
StackView登場以前は、大量のConstraintでゴチャついていたStoryBoardですが、これの登場によりスッキリきれいに、わかりやすくなりました。
ViewとViewの間にあらたなViewを差し込むなども簡単になって本当に感動しました。
StackViewを理解する上でスーパー役に立った記事はこちらです。
リスト系
ListView
なにかを一列に並べたいとき、AndroidではListViewを使います。
ここでは、ListViewのリストアイテムを複雑にカスタマイズした物というよりは、超単純に一列に要素を並べるようなリスト表示を想像してください。
iOSでは
TableViewを使います。
TableViewは、ごくシンプルなリスト表示をするのに適しています。
RecyclerView(カスタマイズしたリスト)
もう最近はリスト表示するならRecyclerViewかなと思うので、分けてみました。
RecyclerViewというか、リストアイテムを複雑にカスタマイズして、リスト表示(スクロール表示)させたい場合です。
iOSでは
ScrollView+StackViewを使います。
何かをスクロール表示させたいとき、スクロール領域はScrollViewで、各アイテムはStackViewで実装します。
Fragment
いまやAndroidに欠かせない存在となったFragmentですが、今回は、Activityの中で複数の画面を入れ替えたり
する場合を想像してください。
iOSでは
xibを使い、ViewControllerの中で入れ替えました。
xibは、Androidでいうxml(レイアウトファイル)のようなものです。
私はFragmentに紐づくxmlを想定し、それぞれの画面をxibで作成し、Activityのような役割である、ViewControllerの中で、表示するxibを入れ替えてFragmentのような動きで画面切り替えを実現しました。
サンプル
ボタンを押してxibを切り替えるサンプルです
class ViewController: UIViewController {
@IBOutlet weak var container:UIView!
let redView:UIView = UINib(nibName: "RedView", bundle:nil).instantiate(withOwner: self, options: nil)[0] as! UIView
let blueView:UIView = UINib(nibName: "BlueView", bundle:nil).instantiate(withOwner: self, options: nil)[0] as! UIView
var changeFlag = false
override func viewDidLoad() {
super.viewDidLoad()
changeView()
}
func changeView() {
let width = self.container.bounds.size.width
let height = self.container.bounds.size.height
let frame = CGRect(x:0, y:0, width:width, height:height)
if changeFlag {
blueView.removeFromSuperview()
redView.frame = frame
container.addSubview(redView)
changeFlag = false
} else {
redView.removeFromSuperview()
blueView.frame = frame
container.addSubview(blueView)
changeFlag = true
}
}
@IBAction func click(sender:AnyObject){
changeView()
}
}
Buttonの入っているViewが固定Viewで、containerが可変Viewです。
こんな感じで、 xibからViewを作って、表示フラグによって入れ替えることで、Fragmentで画面切り替えチックな動きを実現しました。
これは、今回この記事を書こうと思ったきっかけの実装で、かなり悩みに悩んだ結果なのですが、もっと良いやり方があったら是非コメントなどで教えてください![]()
まとめ
ライフサイクル系
| Android | iOS |
|---|---|
| onCerate | loadView / viewDidLoad |
| onResume | viewWillAppear / viewDidAppear |
| onStop | viewDidDisappear |
| onDestroy | - |
UI系
| Android | iOS |
|---|---|
| ConstraintLayout | AutoLayout(Constraint) |
| LinearLayout | StackView |
| ListView(シンプル一列並び) | TableView |
| RecyclerView(カスタマイズしたリスト) | ScrollView + StackView |
| Fragment | xibをいれかえ |
おわりに
OS間で、いいところ、不便なところはそれぞれありますが、どちらか得意な方でイメージを作っておくと、同時に理解が深まりやすいかな?と思いました。
私のように、Androidのアレ、iOSでどうするんだ〜!と悩んでいる方の参考になったら嬉しいし、これを読んでiOSエンジニアの方がAndroid開発にも興味を持っていただけたら嬉しいです!![]()
