2019年9月15日日曜日

iOS 13, Are you ready?

Flask のアプリ、7本をiOS 13 / watchOS 6 対応をして準備完了しました!
Zones, FitPort, Standland, Cube, Timesheet, Timelet, Coyomi

OS正式リリースの前日、9月18日にリリース予定です。お楽しみに!

対応、いやー大変でした。
なにが大変だったかというと、なんかもう、いろいろ?


Localize Bug

いくつかあったのですが、最後まで様子見していたのが、テーブルセルのローカライズがされない問題。
以下の場合に発生します。
  • Storyboardの.strings ファイルを使ってローカライズしている
  • TableViewCellのStyleにBasicやRight Detailなどを利用している
結局最後のGMまでFixはされなかった。
遭遇する人は多いと思ったのだが、Feedback AssistantでReportした内容をみると、

Recent Similar Reports: Less than 10
...って、10以下って少なくね!?


Page Sheet

XCode 11でビルドして最初に気づくのが、ModalのデフォルトがPage Sheetになっていること。
iOS 12時代の形式に戻すには、Full Screen系に選択しなおしすればOK。
だけど、せっかくならPage Sheet使ってみたいなー と気軽に入れ始めたら、あれこれ引っ掛った。
  • Modalの画面からさらにModalを出していた場合の対処
  • 編集画面の場合は、変更有無をチェックして Swipe to Dismiss できない処理を追加
  • 元画面が見えている扱いなので、viewWillAppear 系の呼ばれ形が変わる。たとえば、viewWillAppearで変更内容を一括して再更新している画面(手抜き処理)が元画面の場合、小画面で変更した内容が反映されない など
  • 元画面がSceneKitの場合は、Renderingでの処理を止めてからNodeを操作するなどの考慮が必要
Page Sheetをデフォにするのは思い切ったなー と思うが、おかげで、Swipe to Dismiss する操作がみんな慣れているものになるのも早いと思う。

「Closeボタンを上に置くと操作しにくいから、下に置くか?」という迷いももう解決っす。
あ、でも、Closeボタンはちゃんとあったほうが良いです。Voice Over/Voice Control のために。

Page Sheetと同じ動きだけど、もっと高さが小さいバージョンのものが欲しくなったので作成したりした。こういうやつ。

標準でできるといいのになぁ。


Dark Mode

前回のブログで対応方法を書いた

実際に移行するときの手順は、以下のような感じになると思う。

  1. Storyboard、コードで描いている色を整理
  2. System Colors, Dynamic System Colors に置き換え可能なものを検討する
  3. 整理したものをAsset の Color Setに定義
  4. 利用画像もLight/Dark用を用意 or TintColorで切替にする
  5. Storyboard、コードの色設定をColor Setのものに変更する
  6. cgColor を使っている所は、traitCollectionDidChange や tintColorDidChange などで変更に対応する

できるだけSystem Colorsを使っていきたい所だけど、限られた中から選ぶの結構迷います。
そしてアプリ独自の色もLight/Darkで色を調整したくなってくるという...。

UILabelなどUIKitのコンポーネントに設定したDynamic Colorは、Light/Darkのモード切替時に自動的に反映してくれるけど、CGLayerなどで利用したCGColorは自前で更新する必要があります。

StoryboardのGlobal Tint Colorに、独自に作成したCustom Color Setを指定した場合、その色が他要素に使われていないとXCode再起動などで色設定が消えてしまうバグ?があります。

前からある現象だけど、StoryboardでCustom Color Setを設定している箇所にコードから色を設定しても反映されない(viewDidLoad以降にStoryboardの設定で上書きされてしまう?)ことがあります。


Voice Control, Voice Over

Voice Control がiOS 13で追加になります!

Voice Overよりも、Controlの方が対応が簡単と思うし、使いたい人も多いと思うので、Accessibilityの第一段階として取り組むのはいいと思った。

Voice Overの場合は、読ませる順番、読ませる内容、スクロールの移動、ローター使った見出し移動 など注意すべき箇所は多いのですが、Voice Control の場合は、操作できるところを明確にするだけでも助かるはず。("Show Numbers" で番号を表示して使う)
さらに、名前も整理しておくと、 "Tap [名前]" のように直接操作できるようになる。(何回も操作が必要なStepperなどでは名前がないと操作がツライ。)


Accessibility系をやりながら思ったこととしては、
まとめて読ませる括りのものは1つのViewにいれて、専用のクラスを設定するようにしておくと、やりやすいです。
accessibility***系メソッド をoverrideして書けるので。


他にも色々学んだことは多いのだけど、書くとめっちゃ長くなりそうなのでまた機会があれば。

• • •