iOS11対応についてまとめました。

iOS11変更点についてはネットで良い記事があるので今回は自分が参加しているプロジェクトに対して対応していた内容をまとめてみました。
まず、現在のプロジェクトの状況を簡単に説明をすると、5年以上経っているプロジェクトでObj-Cとswift3が共存している。かなり古いプロジェクトです。部分的にstoryboardを導入しているが、xibも使わず、コードで画面作りしてところもかなり多いプロジェクトです。

修正した箇所は色々あったんですが、「おれっ」と思ったのが大きく下記の5つです。

  1. ナビゲーションバーの仕様変更
  2. UI系のメインスレッドの警告
  3. UITableViewのcell高さ設定の仕方
  4. @objc swift <-> Obj-Cの共有メソッド
  5. Toolbarの使い方

この記事はiOS11 beta10の基準で書いています。対応方法はは色々あると思うので、あくまで参考までにしてください。

1. ナビゲーションバーの仕様変更

iOS11からナビゲーションバーLarge Titleができるようになり、UI的に色々変わったらしい。


現在のプロジェクトでTitleViewにカスタマイズしたViewを入れたりUIButtonボタンを入れたりするところがあったのでそれが原因でクラッシュする現象が発生していました。
クラッシュタイミングは画面と画面の遷移の際に、正確に言うと遷移するアニメーション処理で起きています。
もちろんPush, PopするときにanimatedNOにするとクラッシュはしないが、根本的な対応ではないのでこのプロジェクトではカスタマイズしたビューを削除することに。
きちんとするならiOS11にふさわしいUIデザインを書き直しをする対応がベストだと思います。

新しいUINavigationBar, UINavigationItem & UIRefreshControl #WWDC17 #WWDC2017

 

2. UI系のメインスレッドの警告

XCode9からなんかメインスレッドで処理すべき処理に対してチェックする機能ができたらしく。
紫色の警告が表示されるようになっています。
潜在バグでUI系の処理がスレッドになってしまい、正常に動作しない処理を気づくことができて直しました。

関連記事はこちら。
https://developer.apple.com/documentation/code_diagnostics/main_thread_checker

 

3. UITableViewのcell高さ設定の仕方

一番苦労した件ですが、動的セールで高さがそれぞれ違う場合、遷移して戻ったり、datasource更新によりreloadDataしたりするとOffsetがずれる現象が発生していました。
原因はTableViewのdelegateメソッドのestimatedHeightForRowAtIndexPathを実装していなかったからです。iOS11からは実装が厳しくなったらしいです。とりあえず同じロジックを書くことで対応できました。

 

 

 

4. @objc swift <-> Obj-Cの共有メソッド

 

Swiftで書いたメソッドをObj-Cで使うと必ず @objcを頭に書く必要になったようです。まめに書きましょう。

おまけで、上記の件でビルドログがうるさくなるので以下のbuild settingを書いておくと静かになります。

https://stackoverflow.com/questions/44379348/the-use-of-swift-3-objc-inference-in-swift-4-mode-is-deprecated

 

5. Toolbarの使い方

今のプロジェクトってUIToolbarを画面ことにあり、なぜかこれを見た目の理由でカスタマイズしていました。本来のToolbarで抽象化されている機能ではなく、UIButtonをaddsubViewしてるのが問題。
そもそも、それ実装の仕方が気に入ってないが、iOS11からはタッチが効かなくなっているのでUIViewで全て書き直しました。
やっぱり、Cocoa Frameworkに優しい書き方をしないとバージョンアップするときに大変なことになることを実感しています。

以上ですが、間違っている内容もあると思うのでご参考まで。

この投稿へのコメント

  1. しょうせい

    >3. UITableViewのcell高さ設定の仕方
    困っているところ非常に参考になりました!

    どこかで調べてきた内容なのでしょうか?
    もし参考記事ありましたら教えて頂きたく存じます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

トラックバック・ピンバック

トラックバックはありません。

トラックバック URL