71393
以下のようなコードで、Storyboard上で配置したボタンのサイズを変更しようと思ったのですが  
CGRectを使用するとボタンの位置情報まで変化してしまいます。

```

    //ボタンサイズの変更
    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        self.button.frame = CGRect(x: 0, y: 0, width: 80, height: 80)
    }
    
```

ボタンの現在の位置情報を取得して、その値をCGRectのx,yに入力しようかとも思ったのですが、その方法もわかりません。  
もしくは、CGRectを使用せずにwidthとheightのみを変化させる方法はないのでしょうか？
CC BY-SA 4.0
2020-10-21T11:49:59.560
71391
2020-10-21T12:50:43.560
2020-10-21T12:16:19.850
36446
36446
question
swift
Storyboard上で配置したボタンのサイズのみをコードで変更する方法
> CGRectを使用せずにwidthとheightのみを変化させる方法はないのでしょうか？

「CGRectを使用せずに」と言う点は守れているか微妙ですが、 **`CGRect`と言うのは、`origin`と`size`からなる構造体**
ですので、その`size`だけを変更することならできます。

```

            self.button.frame.size = CGSize(width: 80, height: 80)
    
```

確認は`viewDidLoad()`の中にこの行を置いて行いましたが、表示の方も確かに`size`だけが変更された状態になります。

widthとheightを別々に設定することもできます。

```

            self.button.frame.size.width = 80
            self.button.frame.size.height = 80
    
```

ほんの少しの違いですが、これはコンパイルできません。

```

            self.button.frame.width = 80
            self.button.frame.height = 80
    
```

これは`CGRect`のプロパティとしての`width`, `height`が読み出し専用の計算型プロパティであるためです。

`CGRect`のプロパティ`size`や、`CGSize`のプロパティ`width`,
`height`などは、普通に書き込み可能な格納型のプロパティなので、上のような代入は可能なのです。

* * *

ちなみに`viewDidLayoutSubviews()`の中でレイアウトのやり直しが発生する可能性のあるプロパティの変更を行うと、再レイアウトの無限繰り返しが発生するなどの異常が見られることがあります。他に方法があるのであれば、`viewDidLayoutSubviews()`をoverrideして何かの処理をさせると言うのは避けた方が良いでしょう。
CC BY-SA 4.0
2020-10-21T12:50:43.560
71393
2020-10-21T12:50:43.560
13972
71391
answer