

UISegmentControlについて質問になります。  
添付画像のようなSegmentControlにおいて、「First」選択時に全体のサイズを変更せずに、  
「Fisrt」の幅を広くし、「second」の幅を狭めることは可能なのでしょうか。

以上になります。みなさんよろしくおねがいします。

[![画像の説明をここに入力](https://i.stack.imgur.com/0nkhf.png)](https://i.stack.imgur.com/0nkhf.png)


CC BY-SA 4.0
2019-04-09T08:06:50.383
54044
2022-05-19T22:03:00.247
2020-07-02T05:08:24.843
3060
32852
question
swift ios objective-c
iOS の segment control で幅のサイズを調整したい


[`UISegmentedControl`の公開API](https://developer.apple.com/documentation/uikit/uisegmentedcontrol)には、特に選択/非選択で幅を変更するようなものは見当たりませんが、各セグメントの幅を個別に設定することはできるようなので、ちょっとしたコードを書いてやれば実現できるかと思います。

[code]

    import UIKit
    
    class ViewController: UIViewController {
    
        @IBOutlet weak var segmentedControl: UISegmentedControl!
    
        override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view.
    
            let normalAttr: [NSAttributedString.Key: Any] = [
                .font: UIFont.systemFont(ofSize: 12)
            ]
            segmentedControl.setTitleTextAttributes(normalAttr, for: .normal)
            let selectedAttr: [NSAttributedString.Key: Any] = [
                .font: UIFont.boldSystemFont(ofSize: 18)
            ]
            segmentedControl.setTitleTextAttributes(selectedAttr, for: .selected)
    
            segmentedControl.addTarget(self, action: #selector(segementValueChanged), for: .valueChanged)
            segementValueChanged(segmentedControl)
        }
    
        @objc func segementValueChanged(_ sender: UISegmentedControl) {
            for i in 0..<sender.numberOfSegments {
                let width: CGFloat = sender.selectedSegmentIndex == i ? 80 : 60
                sender.setWidth(width, forSegmentAt: i)
            }
            //...
        }
    
        //...
    }
    
[/code]

※Storyboard上で`UISegmentedControl`全体の幅を、選択状態のセグメントの幅(上の例では`80`が1個)と非選択状態のセグメントの幅(上の例では`60`が1個)の合計(=`140`)にしておきます。  
※また、`UISegmentedControl`のactionはStoryboard上では接続していないと言う想定です。

[![First
selected](https://i.stack.imgur.com/KS1mO.png)](https://i.stack.imgur.com/KS1mO.png)  
[![Second
selected](https://i.stack.imgur.com/d7B3e.png)](https://i.stack.imgur.com/d7B3e.png)

この例では選択状態のテキストのフォントと非選択状態のテキストのフォントを区別していますが、その部分が不要なら`let
normalAttr...`からの8行は不要です。


CC BY-SA 4.0
2019-04-09T08:56:14.043
54047
2019-04-09T08:56:14.043
13972
54044
answer