Tech Blog

グローバルな家族アプリFammを運営するTimers inc (タイマーズ) の公式Tech Blogです。弊社のエンジニアリングを支える記事を随時公開。エンジニア絶賛採用中!→ https://timers-inc.com/engineering

iPhone専用だったアプリをiPadにも対応した話

f:id:bboykk:20180928075447j:plain

お久しぶりです。iOSDC 2018での発表リジェクトコンのスタッフが一段落して暫く抜け殻になっていたかっくん(@fromkk)です。
Timersでは毎年9月下旬頃に合宿を開催しているのですが、そこでは普段の業務ではやらない事をテーマに各グループや個人で集中して作業をする事になっています。
僕は常々FammiPadに対応するといいなと思っていたので、今年はFammのiPad対応をテーマに選びました。

f:id:bboykk:20180927091445j:plain

※早く着いたので一人で記念撮影しているの図

最初に

まずやることはXcodeのアプリのターゲットの General タブにある Deployment InfoDevicesUniversal にします。
既にここが Universal になっている人はここから先を見る必要は無いかもしれません。

f:id:bboykk:20181018093445p:plain

モーダルのポップオーバー対応

上記の DevicesUniversal にしてビルドして一通りアプリを触ってみるとすぐクラッシュが発生しました。
原因はアクションシートがポップオーバーに対応していなかった為です。
なのでひたすら UIAlertControllerpreferredStyle.actionSheet になっている箇所を探して popoverPresentationControllersourceViewsourceRect を設定していきます。

alertController.popoverPresentationController?.sourceView = view
alertController.popoverPresentationController?.sourceRect = loginButton.frame

UIBarButtonItem から呼び出されている場合は、 barButtonItem を設定します。

alertController.popoverPresentationController?.barButtonItem = saveButton

同じシンボルのものをまとめて検索する方法

ちなみに preferredStyle.actionSheet のものだけをどうやって探すかですが、コードで .actionSheet を選択して右クリック(Ctrl+クリックや2本指でクリックの人もいるかも)して Find Selected Symbol in Workspace をタップすると .actionSheet を利用している箇所だけをピックアップする事が出来ます。

f:id:bboykk:20181018095502p:plain

Xcodeのナビゲーターエリアで虫眼鏡ボタンをクリックして Find > Reference > Containing を設定してからテキストフィールドに UIAlertControllerStyleActionSheet を入力して検索しても同じ事が出来ます。

f:id:bboykk:20181018095324p:plain

話が逸れましたが、 UIActivityViewController を利用している場合も同じ様にクラッシュするので上記の方法で検索して、同じ様に popoverPresentationController を設定します。

UI微調整

上記でクラッシュは起きなくなったのですが、今度はUI崩れが気になりました。
誰がどう見ても崩れてる所や、見れなくは無いけど改善した方が良さそうな所など、アプリをひたすら触って見つけては対処していきます。
ここの対処の方法はアプリによって方法は様々かと思いますが、Storyboardファイルの場合は Size Classes に対応したり、

f:id:bboykk:20181018101411p:plain

UIViewUIViewControlleroverride func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?)NSLayoutConstraint を調整したりしました。

諦めた事

ウィンドウサイズの可変対応

Fammはここ2年ぐらいで記述されているコードはほとんど AutoLayout に対応したり Storyboard で作成されているのですが、それ以前のコードは frame をゴリゴリに計算しているコードが残っています。 frame 計算を頑張るのは書いてる時は気持ち良かったりするのですが、後から見た時に人間が見るコードでは無くなっている事が往々にしてあります。
また、安易に UIScreen.main.bounds をベースにレイアウトが計算されていると、可変ウィンドウに対応しようとすると地獄を見る事になります。
これに対応するのは現段階では厳しいと判断したので一旦アプリのターゲットの Deployment InfoRequires full screen にチェックを入れてリリースする事にしました。

iPadでは縦横を気軽に切り替えたり、Split Viewで他のアプリと同時に利用する事もあるかと思いますが、現時点では泣く泣く諦めました。

まとめ

これまでの合宿ではSwiftのバージョンを2->3にしたり、3->4にしたりしていたのですが、今回はFammをiPadに対応してみました。
まだまだ完璧では無いですが、とりあえず動くものをリリースして、ダメな所は少しずつ改善していければ良いかなと思います。

積極採用中!!

子育て家族アプリFammカップル専用アプリPairyを運営するTimers inc. では、現在エンジニアを積極採用中! 急成長中のサービスの技術の話を少しでも聞いてみたい方、スタートアップで働きたい方など、是非お気軽にご連絡ください! 採用HP : http://timers-inc.com/engineerings

Timersでは各職種を積極採用中!

急成長スタートアップで、最高のものづくりをしよう。

募集の詳細をみる