5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

合法にUITabBarButtonを取得する

Last updated at Posted at 2018-12-18
  • Swift4

動機

https://qiita.com/KosukeOhmura/items/71e50615fb7e95fe5d61
↑特定のタブバーアイテムにのみこれがしたい

問題

非公開クラスである UITabBarButtonUITabBarSwappableImageViewに直接アクセスするとリジェクト理由になる。
isKindOfClassis 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番目取り出しました。

あとはうまく使ってください。
タブ大量に作って省略されると使えないので気をつけてください。あとレンダリング後に使ってください。どちらも座標が重複していてアレになります。

おしまい。

5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?