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

※早く着いたので一人で記念撮影しているの図
最初に
まずやることはXcodeのアプリのターゲットの General タブにある Deployment Info の Devices を Universal にします。
既にここが Universal になっている人はここから先を見る必要は無いかもしれません。

モーダルのポップオーバー対応
上記の Devices を Universal にしてビルドして一通りアプリを触ってみるとすぐクラッシュが発生しました。
原因はアクションシートがポップオーバーに対応していなかった為です。
なのでひたすら UIAlertController の preferredStyle が .actionSheet になっている箇所を探して popoverPresentationController の sourceView と sourceRect を設定していきます。
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 を利用している箇所だけをピックアップする事が出来ます。

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

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

UIView や UIViewController で override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) で NSLayoutConstraint を調整したりしました。
諦めた事
ウィンドウサイズの可変対応
Fammはここ2年ぐらいで記述されているコードはほとんど AutoLayout に対応したり Storyboard で作成されているのですが、それ以前のコードは frame をゴリゴリに計算しているコードが残っています。   frame 計算を頑張るのは書いてる時は気持ち良かったりするのですが、後から見た時に人間が見るコードでは無くなっている事が往々にしてあります。
また、安易に UIScreen.main.bounds をベースにレイアウトが計算されていると、可変ウィンドウに対応しようとすると地獄を見る事になります。
これに対応するのは現段階では厳しいと判断したので一旦アプリのターゲットの Deployment Info の Requires full screen にチェックを入れてリリースする事にしました。
iPadでは縦横を気軽に切り替えたり、Split Viewで他のアプリと同時に利用する事もあるかと思いますが、現時点では泣く泣く諦めました。
まとめ
これまでの合宿ではSwiftのバージョンを2->3にしたり、3->4にしたりしていたのですが、今回はFammをiPadに対応してみました。
まだまだ完璧では無いですが、とりあえず動くものをリリースして、ダメな所は少しずつ改善していければ良いかなと思います。
積極採用中!!
子育て家族アプリFamm、カップル専用アプリPairyを運営するTimers inc. では、現在エンジニアを積極採用中! 急成長中のサービスの技術の話を少しでも聞いてみたい方、スタートアップで働きたい方など、是非お気軽にご連絡ください! 採用HP : http://timers-inc.com/engineerings