update.どうも、ご無沙汰してますiOS11対応どうですか、疲れますよね。今回は対応中出会ったツールバーのレイアウト崩れに関するtipsです。NDAがうんたらかんたらでほんとはスクショ張って説明したいんですがどこまでがセーフでアウトかわからないんでとりあえずテキストで説明しようと思います。そもそもツールバーのAutoLayoutってなんやhttps://developer.apple.com/videos/play/wwdc2017/204/このビデオのだいたい30分くらいのところでさらっと「ナビゲーション周りAutoLayou対応しといたで」って言ってます(超意訳だからなんや、とかどうしたこうしたとかは特に触れられてません(英語わかる人にはわかるのかも)つまりどうなる表示崩れしました。スクショ貼ることができないのですごい説明がわかりにくくて申し訳ないんですが僕が出会ったのは画面幅を6等分した幅のボタンをツールバーに置いていた場合表示崩れを起こしました。画面遷移時にフリーズを起こしました。言わずもがなAutoLayoutです。_UIButtonBarStackViewてな具合です。UIBarButtonItem(customView:)でviewを配置するとこのStackViewにview配置されていくことになります。http://qiita.com/yimajo/items/10f16629200f1beb7852さて、つまりどういうことかというとこれまで画面幅を表示するボタンの数で割ってツールバーのボタンの幅を決めてcustomviewを作りUIBarbuttonItemU(customView:)してた場合この左右の16px、つまり32px分のズレが生じるわけです。toolbarはAutoLayoutによってボタンをうまいこと表示しようとするので表示するどれかのボタンがしわ寄せで小さくなったり最悪、描画のタイミングでメモリを食いまくってフリーズに陥ります。iOS11でボタンを均等な幅でツールバーに敷き詰めるときは36px分を画面幅に対して考慮する必要があります。一応制約なのでtoolbarからsubviewsを漁りまくってStackViewを見つけて、constraintを弄れば16pxを0pxにして回避はできそうですが非公開クラスなのであまりアクロバティックなことをするのはやめたほうがいいと思います。表示が崩れるのかその2その1の表示崩れが治ったと思ったらつかの間、また表示ズレが起きました。ツールバーを表示するたび(ツールバーのボタンを敷き詰めない画面とない画面を行ったり来たり)マージンが変わってしまっていました。)結論からいうとこれがいけなかったです。fillでしたこのうちdistributinの情報が重要でしたhttp://qiita.com/yucovin/items/ff58fcbd60ca81de77cbStackViewのdistributionがfillとはどういう状態かというとStackView内のViewをStackViewいっぱいまで引き伸ばして表示する設定です。StackViewと制約の競合なので幅を固定にしたViewをtoolbar常に置いた場合(というかそうするしかない)StackViewの引き伸ばそうとする制約と競合して表示崩れを起こします。Hierarchyを見ると!マークの警告が出てるかもしれません。.flexibleSpace,~~)を使いますこいつはツールバーに柔軟な余白を設けるために使われるものです(いい説明が思いつかん)言われてみればそりゃそうかとなるんですが固定幅でうまく行かないんなら可変幅で埋めよう!ってことですね。試してみたのですが例えばツールバーの幅を全然埋め切らない幅のボタンを2つsetToolbarした場合:[button,button]ボタンは画面の両サイドに設置されました。この場合警告は出ません。次に同じようにツールバーの画面幅を埋め切らない幅のボタン3つをsetToolbarした場合:[button,button,button]以下の絵のような配置になりましたStackViewが頭の悪い配置をしてくれたわけです。さあこのボタンを左側2つ、右側1つにする場合隙間に固定値透明なviewを置くと警告表示崩れしますのでflexibleSpaceのbuttomItemを[button,button,flexible,button]でならべてsetToolbarItmesするとこんな感じになってくれて警告もなく表示してくれます。正しいスペースの開け方のようです。これで終わりじゃないぞ警告も消えたし表示崩れもなくなったしよかったよかったと思ったら終わりじゃないです。画面遷移前にviewcontrollerのnavigationbarにsetToolbar、などアニメーションが絡むタイミングでsetToolbarすると起きますが(もしかしたら他でも起きるかも)ボタンの個数が変わる場合、autolayoutの調整が走る時にアニメーションとなって目に見えてしまうことがあります。setToolBarItemをした後に場合によってはviewController.navigationController.toolBar.layoutIfNeeded()をしてAutoLayoutの反映をさっさとしてしまったほうがいいかと思います。requestStockLike16@HirotoshiKawauchiiosアプリエンジニアです。upLoginユーザーは見つかりませんでした。