🐰

AppKitでツールバーのサイドバー開閉ボタンが消失する現象への次善策

に公開

概要

macOS Sonoma以降のAppKitでは、NSToolbarのサイドバーおよびインスペクタ側に置いたアイテム(ボタン)が、ペインを閉じた際にオーバーフローしてしまう現象があります。この時にツールバーをよく見てみると、右端の方に「>>」のようなアイコンのその他メニューボタンが現れるはずです。


サイドバーを閉じるとボタンが消失してしまう(望まない挙動)


サイドバーを開閉してもボタンが残る(正しい挙動)


サイドバー開閉ボタンがオーバーフローした状態

このオーバーフローの仕組み自体はNSToolbar標準の機能なので問題はないのですが、サイドバーやインスペクタの開閉によってオーバーフローが生じることはおかしいので、普通にAppKitのバグなのだと思います。

少なくとも、macOS Tahoe 26.4時点でもこの現象は健在です。

対策

これを回避するためには、NSSplitViewItemのminimumThicknessに十分な幅の値を設定することが有効です。これだけです。minimumThicknessはNSSplitViewItemの最小幅を決めるものであり、サイドバーやペンスペクタの場合はそのペイン幅の最小値となります。

この時に、NSToolbarの表示モードをiconAndLabelにしてテキストラベルが表示された状態において十分に収まる幅をminimumThicknessにする必要があります。

仮に日本語環境で、ボタン名が「サイドバー」だとしたら、Tahoe環境ではminimumThicknessを少なくとも 157 以上にする必要があります。実運用上では200程度にしておけば問題が起こりにくいです。

これは「日本語環境の場合」「ラベルが『サイドバー』である場合」「macOS Tahoeスタイルの場合」といった不安定な変数を条件にしているので、環境によっては再発する可能性もあります。

また、イスペクタ側では見た目のスタイルがサイドバーとは異なるので発動条件が少し変わる可能性もあります。ただ、どちらも最低幅を200程度にしておけばだいたい大丈夫だろう、という運用でカバー案件になっています。

NSToolbarのスタイルをiconOnlyに固定するとラベルが非表示になるのでサイドバー幅を予測しやすくなりますが、ツールバースタイルの変更機能はユーザーが自由に行える仕組みであり、このようなバグのためにそれをふさぐ事はあまりよい方策とは考えにくいです。バランスを見てどのような対応をするのかをよく吟味してください。

関連

https://stackoverflow.com/questions/77462445/macos-toolbar-items-in-sidebar-go-to-overflow-menu-when-sidebar-is-hidden

Discussion