- Swift4
動機
https://qiita.com/KosukeOhmura/items/71e50615fb7e95fe5d61
↑特定のタブバーアイテムにのみこれがしたい
問題
非公開クラスである UITabBarButton
や UITabBarSwappableImageView
に直接アクセスするとリジェクト理由になる。
isKindOfClass
やis NSClassFromString()
を使うのもも避けたい。
なるべくAppleの逆鱗に触れないように特定のTabBarItemのアイコンのバッジをカスタムしたい。
カスタムビューとか作るのめんどくさい。
ライブラリ探すのめんどくさい。
実装
extension UITabBar {
// タブのボタンをとりだして配置後のx座標でソートしてindex番目を返す レンダリング後に呼ぶ didLoad等では動かない
func findButtonByXOrder(_ index: Int) -> UIView? {
// 子のうち一番横幅のおおきいもの(= background)を取り除く
let buttons: [UIView] = subviews.filter({ $0 != subviews.max(by: { $1.frame.width > $0.frame.width }) })
if index < 0 || buttons.count <= index { return nil }
// frame.origin.xでソートしてindex番目を返す
return buttons.sorted(by: { $0.frame.origin.x < $1.frame.origin.x })[index]
}
}
UITabBarのサブビューはUITabBackground(だっけ?)とUITabBarButtonであり、
横幅で判定してバックグラウンドを弾いてのこりのUIView継承してるクラスのインスタンスのframe.origin.xでソートしてindex番目取り出しました。
あとはうまく使ってください。
タブ大量に作って省略されると使えないので気をつけてください。あとレンダリング後に使ってください。どちらも座標が重複していてアレになります。
おしまい。