macOS 26のコーナーデザインが気になる人へ——アップデートしたら角丸の半径がアプリによってバラバラで落ち着かない、という経験はないだろうか。Safariやシステムアプリはやたらぐるっと丸いのに、サードパーティアプリの角は微妙に違う。この「不統一感」こそが問題だ、という視点から書かれた記事を紹介する。
背景:「丸すぎる」より「バラバラ」がつらい
macOS 26では角丸デザインが強化されているが、システムアプリとサードパーティアプリの間でコーナー半径に大きなばらつきが生じている。よくある対処法は SIP(System Integrity Protection)を無効化 してシステムライブラリを直接書き換えることだが、これは /root 以下のセキュリティを下げるリスクを伴う。
作者が選んだアプローチは逆転の発想だ——「全部を角なしにする」のではなく、「全部を同じ半径で丸くする」。SIPを無効にせずに実現できるのがポイントである。
仕組み:DYLD_INSERT_LIBRARIES × Objective-C Method Swizzling
macOSには DYLD_INSERT_LIBRARIES という環境変数があり、プロセス起動時に任意の dylib(動的ライブラリ) を注入できる。Linuxの LD_PRELOAD に相当する仕組みだ。
このdylibの中でObjective-Cの Method Swizzling を使い、NSThemeFrame(ウィンドウフレームを管理するAppKitのクラス)のコーナー半径を返すメソッドを差し替える。対象は以下の4メソッド:
_cornerRadius_getCachedWindowCornerRadius_topCornerSize_bottomCornerSize
すべて固定値 23.0 を返すように上書きする。また com.apple. プレフィックスを持つApple純正アプリはスキップし、サードパーティGUIアプリのみに適用する設計になっている。
実装例:ビルドから自動ロードまで
// SafariCornerTweak.m(抜粋)
static CGFloat kDesiredCornerRadius = 23.0;
static double swizzled_cornerRadius(id self, SEL _cmd) {
return kDesiredCornerRadius;
}
// ... 他3メソッドも同様に差し替え
__attribute__((constructor)) static void init(void) {
NSString *bid = [[NSBundle mainBundle] bundleIdentifier];
if (!bid || [bid hasPrefix:@"com.apple."]) return;
Class cls = NSClassFromString(@"NSThemeFrame");
// method_setImplementation で差し替え
}
コンパイル・署名・配置は以下のコマンドで行う(arm64e/x86_64のユニバーサルバイナリ):
clang -arch arm64e -arch x86_64 -dynamiclib -framework AppKit \
-o SafariCornerTweak.dylib SafariCornerTweak.m
sudo mkdir -p /usr/local/lib/
sudo cp SafariCornerTweak.dylib /usr/local/lib/
sudo codesign -f -s - /usr/local/lib/SafariCornerTweak.dylib
ログイン時に自動適用するために LaunchAgents のplistで DYLD_INSERT_LIBRARIES をセットする仕組みも紹介されており、再起動後も設定が維持される。
まとめ・所感
SIPを無効にせずに DYLD_INSERT_LIBRARIES で振る舞いを変えるアプローチは、macOSのローレベルハックとして非常に参考になる。Method Swizzlingはデバッグやテストでもよく使われる手法だが、こうした「UIの統一感」という実用目的で使うのは面白い視点だ。
AppleがUI設計の基準として大きな影響力を持つがゆえに、デザイナーが「Appleに倣え」と判断しがちになる、という作者の指摘も鋭い。丸角のトレンドがYouTubeなど他社UIにも波及していることへの皮肉も含まれており、技術的な解決策だけでなくデザイン哲学への問いかけとしても読める記事だ。macOSのUI挙動を制御したい開発者や、dylibインジェクションに興味があるiOS/macOSエンジニアは元記事のコードも確認してほしい。