SwiftにてTabBar にボタン を設置して押したら横に遷移としたいのですが、以下のコードではボタン自体が表示されません。どうしたらいいでしょうか？

```

    let button:UIButton = UIButton()
        
        override func viewDidLoad() {
            super.viewDidLoad()
    
            // Do any additional setup after loading the view.
        
            // タブバーに重ねるボタンを作成
            // ここではサイズとか位置は気にしない。
            let image = UIImage(named: "button.jpg")
            self.button.setBackgroundImage(image, for: .normal)
            self.button.addTarget(self, action: Selector(("openModal")),
                                  for: UIControl.Event.touchUpInside)
            
            // self.view ではなくて、self.tabBar にaddSubviewする
            self.tabBar.addSubview(self.button)
        } 
    
```
CC BY-SA 4.0
2020-06-30T07:28:31.860
68136
2020-06-30T08:24:23.557
2020-06-30T07:40:04.243
3060
39481
question
swift
Swift TabBar にボタン
`tabBar`は、

```

        @IBOutlet weak var tabBar: UITabBar!
    
```

てな感じで宣言され、正しく表示されているものと仮定しています。

一番問題のあるところは、あなた自身のコメントが示しているようです。

```

            // ここではサイズとか位置は気にしない。
    
```

あなたのコードでは`button`のサイズや位置を表す`frame`が未設定のままですが、その場合の動作は未定義になります。最近のiOSでは、対象viewの左上隅(`(0,
0)`)に大きさ(0, 0)で追加されるようです。大きさがゼロですから、「表示されません」と言うことになります。

(なお、古いバージョンのiOSなら違う動作になるかもしれません。)

表示されるようにしたければ、正しく`frame`を設定してやって下さい。

```

        @IBOutlet weak var tabBar: UITabBar!
        
        let button: UIButton = UIButton()
    
        override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view.
            
            // タブバーに重ねるボタンを作成
            let image = UIImage(named: "button.jpg")
            self.button.setBackgroundImage(image, for: .normal)
            //↓`Selector(("openModal"))`ではなく、`#selector(openModal)`を使う
            self.button.addTarget(self, action: #selector(openModal),
                                  for: .touchUpInside)
            // ここではサイズとか位置は気にしないといけない！
            let origin: CGPoint = .zero //位置
            let size = image!.size //サイズ
            self.button.frame = CGRect(origin: origin, size: size)
            
            // self.view ではなくて、self.tabBar にaddSubviewする
            self.tabBar.addSubview(self.button)
        }
    
        @objc func openModal() {
            print(#function)
            //...
        }
    
```

* * *

直接「表示されません」と言う事象には関係ありませんが、`Selector(("openModal"))`という書き方は非推奨です。必ず`#selector`構文を使って下さい。これによりSwiftコンパイラーがメソッド名の綴りミスや、`@objc`の付け忘れなどをコンパイル時にチェックしてくれるようになります。

また、`UITabBar`のような標準UI部品のview階層や動作を変更しようとすると、iOSのバージョンによってはうまく動かなくなったりする可能性がある上に、ユーザを混乱させ、Appleから「Human
Interface Guidelineに適合していない」と判断される可能性もあります。

(最近ネットでApp Storeからrejectされた理由を追っていると、HIG準拠のチェックはゆるいのかなという気はしますが。)

なぜこのようなことを試しているのかを示していただければ、より良い代替手段をご提示できるかもしれません。
CC BY-SA 4.0
2020-06-30T08:24:23.557
68140
2020-06-30T08:24:23.557
13972
68136
answer