質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

833閲覧

コードから制約をつけるとViewが表示されなくなってしまう

hodoru3sei

総合スコア284

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2019/09/24 09:55

以下の画像のような実装を行いたいと考えています。
緑のViewとオレンジのViewはIB上から設定を行い、赤枠のViewをコードで作成してコードで制約をつけたいと考えています。
イメージ説明

コード

以下のようにコードを作成しました。
赤いViewの縦の大きさは可変にしたいのですが、UIViewをイニシャライズする際にCGRectを渡さないとクラッシュしてしまったので適当な値を渡しています。

Swift

1override func viewDidLoad() { 2 super.viewDidLoad() 3 4 let centerview = UIView(frame: CGRect(x: 100, y: self.view.frame.height/2, width: 100, height: 100)) 5 centerview.backgroundColor = .red 6 self.view.addSubview(centerview) 7 centerview.translatesAutoresizingMaskIntoConstraints = false 8 centerview.topAnchor.constraint(equalTo: topView.bottomAnchor, constant: 50).isActive = true 9 centerview.leadingAnchor.constraint(equalTo: self.view.trailingAnchor, constant: 30).isActive = true 10 centerview.bottomAnchor.constraint(equalTo: bottomView.topAnchor, constant: 50).isActive = true 11 }

ビルドしてクラッシュなどはしないのですが、制約が正しくついていないのか画面上に赤いViewが表示されません。制約を全てコメントアウトしてビルドすると画面の中央あたりに表示されます。
制約に沿った形で表示をおこないたいのですが、どうすれば良いのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

幅の制約がないからじゃないでしょうか?
おそらくwidthが0になって表示されなくなっているのだと思います。

追記:
centerview.leadingAnchor.constraint(equalTo: self.view.trailingAnchor, constant: 30).isActive = truewidth の制約がないことにより self.view の右の外側に centerview が幅0で配置されている状態になっています。
修正後のコード

swift

1let centerview = UIView() //frameはautolayoutで設定するので不要ですもしくはUIView(frame: .zero)でも可 2centerview.backgroundColor = .red 3self.view.addSubview(centerview) 4centerview.translatesAutoresizingMaskIntoConstraints = false 5centerview.topAnchor.constraint(equalTo: topView.bottomAnchor, constant: 50).isActive = true 6centerview.trailingAnchor.constraint(equalTo: self.view.trailingAnchor, constant: -30).isActive = true //trailingAnchor、-30に修正 7centerview.bottomAnchor.constraint(equalTo: bottomView.topAnchor, constant: 50).isActive = true

Auto Layout で思い通り行かない場合は下記のように UIViewControllerviewDidLayoutSubviews de frame を確認するといいと思います。

swift

1override func viewDidLayoutSubviews() { 2 print(view.frame) 3}

コードでのAuto Layoutの設定は Anchor だけでなく addConstraints などあるので色々調べてみるといいと思います。

投稿2019/09/24 22:48

編集2019/09/25 11:13
usagi001

総合スコア208

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hodoru3sei

2019/09/25 00:56

centerview.widthAnchor.constraint(equalTo: self.view.widthAnchor, multiplier: 0.5).isActive = true この制約を付け足してみたのですが、表示されませんでした。widthの制約って別のものがあるんでしょうか?
usagi001

2019/09/25 03:06

幅の制約はそれであっています。 もうひとつleadingAnchorが原因ですね。 equalTo: self.view.trailingAnchorとしているので画面外にviewが出ているのだと思います。
hodoru3sei

2019/09/25 06:45

leadingAnchorにしたところ画面に表示することはできました! self.view.trailingAnchorで制約を付けたい場合は、自分のViewのframeなどを計算する必要があるのでしょうか?
usagi001

2019/09/25 10:14

今回の場合はself.viewの右端から30離れた位置にcenterviewを配置したいのだと思われるので簡単にやるなら centerview.trailingAnchor.constraint(equalTo: self.view.trailingAnchor, constant: -30).isActive = true とすればいいのではないでしょうか? コードでautolayoutの設定は色々方法があるので他にも色々検索してみるといいと思います。
usagi001

2019/09/25 10:16

Auto Layout で思い通り行かない場合はViewControllerの override func viewDidLayoutSubviews() でprint(centerview.frame)としてログ出力するかbreakpointを置いて確認するといいと思います。
usagi001

2019/09/25 11:14

回答に記載した方が良さそうだったので回答に追記しました。
hodoru3sei

2019/09/26 02:56

ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問