質問: CGRect(x:x, y:y, width:20, height: 20) myView.addSubview(myBtn) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } } ``` ### 試したこと (1)`View`を配置→ctrl+ドラッグで接続して`myView`という名前でoutletを作成 (2)`view`をオートレイアウトでセンターに配置、制約を追加 ![イメージ説明](https://teratail.storage.googleapis.com/uploads/contributed_images/890a891058c4f0aed5a42bcac7f67e6d.png) (3)バックグラウンドの色を変更 (4)ViewController.swift内にてviewのセンターにボタンを作成、表示するコードを実装 ### 補足 `print()`で座標を出力した所、数値的にはあってたので座標の位置が問題ということではなさそうなのですが.. なぜセンターに表示されないんでしょう..? ![イメージ説明](https://teratail.storage.googleapis.com/uploads/contributed_images/5c0a8482f586834b8ebeb518415aaac7.png)
回答: まず、中心に表示させるためにはx,yは左上の座標なのでそいつ自身の半分を引いてください。 (これをしないと中心から右下にズレてしまいます。) `myBtn.frame = CGRect(x:x-10, y:y-10, width:20, height: 20)` 次になぜ左上にずれてしまうのかについてですが viewDidLoad時にはまだAutolayoutが反映されていないことが原因となります。 UIViewControllerのライフサイクル storyboard(またはxib)では画面上にベースとして表示するサイズを 選べるようになっており、`View:as:IPhone 8`の部分を押すとiPhoneとiPadのアイコンがでてきて 各アイコンを押すとどの画面サイズを見ながらレイアウト配置するかを選べます。 例えばIPhone8のビューで作ってIPhone8 Plusで実行するような場合には viewDidLoadの段階ではautoLayoutが反映されないのでIPhone8で配置したビューサイズのまま値を取ってきてきてしまい、実際にはiPhone8 Plus用にビューが大きくなってしまうため左上にずれてしまいます。 なので、解決方法としてはレイアウトが決定した後に呼び出すと中心に配置することができます。 ``` override func viewDidLayoutSubviews(){ // ここで呼ぶ } ``` autoLayout前後でサイズが変わってしまうものを基準に配置する際には viewDidLayoutSubviews以後に呼び出すようにしましょう。