スタック・オーバーフロー 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のみを変化させる方法はないのでしょうか?
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して何かの処理をさせると言うのは避けた方が良いでしょう。
Correct answer by OOPer on November 28, 2020
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP