TransWikia.com

Storyboard上で配置したボタンのサイズのみをコードで変更する方法

スタック・オーバーフロー Asked on November 28, 2020

以下のようなコードで、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のみを変化させる方法はないのでしょうか?

One Answer

CGRectを使用せずにwidthとheightのみを変化させる方法はないのでしょうか?

「CGRectを使用せずに」と言う点は守れているか微妙ですが、CGRectと言うのは、originsizeからなる構造体 ですので、その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して何かの処理をさせると言うのは避けた方が良いでしょう。

Correct answer by OOPer on November 28, 2020

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP