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

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

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

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

Q&A

解決済

3回答

12497閲覧

UIViewのサイズを中身に応じて変更したい。

dounatsu

総合スコア78

Swift

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

1グッド

0クリップ

投稿2018/03/28 16:13

編集2018/03/29 05:24

UIViewの中にUIViewがいくつか入っているプログラムを組みました。

内側のUIViewはそれぞれ高さが異なり、ボタンを押すと1つだけ表示され、他のUIViewは非表示、高さ0になる様に設定しています。

そこで、外側のUIViewの高さを表示しているUIViewに合わせて自動で変えるプログラムを作りたいのですが、どの様にすれば良いのでしょうか。

添付画像で説明させて頂きますと、緑のViewの中に赤と黄色と青のUIViewが入っていて、下のボタンを押すと、それぞれの色のViewだけ表示する様なものになっています。(外側の緑のUIViewとLabelは残したまま)
redを押したら赤のUIViewだけ表示されて、緑のUIViewが表示しているUIView(この場合赤)に合わせて高さが変わる様にしたいです。(画像だと下側に緑が少しはみ出ていますが、緑のUIViewの中に3つ他のUIViewが入っていると分かりやすくするためで、実際は青のUIViewの下側と緑のUIViewの下側は一致しています。)

イメージ説明

全ての制約と内部のUIViewの高さは分かっているので、緑のUIViewの高さを計算で出すことは可能だと思うのですが、何か他に良い方法はあるのでしょうか。

sizeToFitも試したのですが上手く適用されませんでした。またstoryboard上で中のViewの下部に合わせて制約をつける(外側のUIViewの下部を中のUIViewの下部に合わせて制約をつける)という情報もあったのですが、そもそも外側のUIViewの制約をつけるときに中のUIViewが被制約側の選択肢として出てきませんでした。

文章ばかりで恐縮ですが、ご回答頂ければ幸いです。
よろしくお願いいたします。

追記:
イメージ説明

nun👍を押しています

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/03/28 17:03

2色同時・3色同時表示は必要でしょうか?それとも常に1色だけ表示でしょうか?
dounatsu

2018/03/28 18:53

分かりづらくて申し訳ありません。Story board上三色表示にしていますが、実際は常に赤、黄色、青いずれかが一色だけ表示されており、ボタンを押す度にその色のViewだけが表示される様にしたいです。
dounatsu

2018/03/28 18:55

赤、黄色、青はそれぞれ高さが異なるViewなので、その表示しているViewに合わせて、外側の緑のViewの高さを変えたいです。
退会済みユーザー

退会済みユーザー

2018/03/28 19:06

赤・黄・青の表示切り替えはできていて、緑のviewのボトムだけ操作すればやりたいことが実現できますか?
dounatsu

2018/03/28 21:05

表示切り替えはすでにできているので、緑のボトムだけ中のコンテンツに合わせられれば大丈夫です。
fuzzball

2018/03/29 02:44 編集

選択したViewの高さ変更は制約の値を変更しているのでしょうか?(各Viewの高さ情報をコード側に持っているのか?という質問意図です)
dounatsu

2018/03/29 05:11

全て高さ情報を取得していて、ボタンを押すと押されていないViewをisHiddenで非表示にし、かつHeightを0にしています。
guest

回答3

0

中身のViewを表示したり非表示にしたりして、大外のViewの大きさをいい感じに動的にフィットさせるには、UIStackViewを使うのが非常に簡単だと思います。
必要であればアニメーションも非常に容易です。

但しUIStackView自体には背景やそれ自身を描画する機能はありませんので、今回のケースですと緑のViewをStackViewの大外に設定するか、あるいはその他のViewと同じように一番上に表示されるようにすれば良いでしょう。

制御は

swift

1 @IBAction func showRed(_ sender: Any) { 2 redView.isHidden = false 3 yellowView.isHidden = true 4 blueView.isHidden = true 5 } 6 7 @IBAction func showYellow(_ sender: Any) { 8 redView.isHidden = true 9 yellowView.isHidden = false 10 blueView.isHidden = true 11 } 12 13 @IBAction func showBlue(_ sender: Any) { 14 redView.isHidden = true 15 yellowView.isHidden = true 16 blueView.isHidden = false 17 } 18 19 @IBOutlet weak var redView: UIView! 20 @IBOutlet weak var yellowView: UIView! 21 @IBOutlet weak var blueView: UIView!

こんな感じです。

投稿2018/03/29 00:18

516k

総合スコア189

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

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

dounatsu

2018/03/29 04:48

ご回答ありがとうございます。 StackViewの発想はなかったです。 ありがとうございました。
guest

0

アウトレット

swift

1//内側View 2@IBOutlet weak var viewRed: UIView! 3@IBOutlet weak var viewYellow: UIView! 4@IBOutlet weak var viewBlue: UIView! 5//内側Viewのbottom 6@IBOutlet weak var bottomRed: NSLayoutConstraint! 7@IBOutlet weak var bottomBlue: NSLayoutConstraint! 8@IBOutlet weak var bottomYellow: NSLayoutConstraint!
制約
  • 内側Viewのbottomを外側Viewのbottomに合わせる。(エラーになるので、一つだけ有効にして他はinstalledのチェックを外しておく)
  • その他の制約は適当に。
選択時
  • 選んだ内側Viewを表示し、bottom制約を有効にする。
  • それ以外の内側Viewを非表示のし、bottom制約を無効にする。

swift

1@IBAction func selectedRed(_ sender: UIButton) { 2 //red 3 viewRed.isHidden = false 4 bottomRed.isActive = true 5 //yellow 6 viewYellow.isHidden = true 7 bottomYellow.isActive = false 8 //blue 9 viewBlue.isHidden = true 10 bottomBlue.isActive = false 11}

とりあえずベタ書きで‥。

投稿2018/03/29 03:53

編集2018/03/29 06:09
fuzzball

総合スコア16731

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

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

fuzzball

2018/03/29 03:55

外側Viewって何のために存在しているのでしょうかw
dounatsu

2018/03/29 04:46

ご回答ありがとうございます。 やはりViewの高さを計算して出さないといけなさそうですね。sizeToFitというメソッドがあったので何かしら自動で計算する方法があるのかと思っていました。 元々Scroll Viewの中のUIViewの中に色々な要素を詰め込んでいたので、今回外側のViewといった形で質問させていただきました。
fuzzball

2018/03/29 05:00

>>やはりViewの高さを計算して出さないといけなさそうですね ???どういう意味? 「内部のUIViewの高さは分かっている」のではないのですか?
dounatsu

2018/03/29 05:08

言葉足らずですみません。今回の例で言うと緑のUIViewの中にボタンやラベルやら色々入っていて、それらの高さや制約は一応わかるので、全て合計すれば高さは分かるのですが、単純にもっと良い方法がないか質問させて頂いた次第です。
fuzzball

2018/03/29 05:16

ごめん、全然分からんw もしまだやる気があるなら、各色を選択した時のスクショを追加して下さい。
dounatsu

2018/03/29 05:25

画像追加しました。左側がredを押した時の状態、右側がyellowを押した時の状態です。赤と黄色のViewは緑のViewの中に入っています。
fuzzball

2018/03/29 05:27

赤黄青を緑の中に入れている理由は何でしょうか? 緑の下ではいけないのでしょうか?
dounatsu

2018/03/29 05:38

先にも記入しましたが、元々Scroll Viewの中に大きいUIView(今回の例で緑の部分)を入れてその中に要素を色々詰め込んだ(今回の例でいうとsampleのラベルや赤や青のVIew)のが理由です。緑の部分を取っ払ってScroll Viewに直接並べられるのであれば良いのですが、調べた方法だとScroll Viewの中に大きなUIViewを入れていたので、それに倣ってプログラムを組みました。
fuzzball

2018/03/29 05:44

赤黄青の部分も、下の緑が見えないといけない(赤黄青は横幅一杯ではない)ということでいいでしょうか?
dounatsu

2018/03/29 05:59

赤、黄、青は横幅いっぱいで緑に合わせています。
fuzzball

2018/03/29 06:09

回答を修正してみました。
dounatsu

2018/03/29 06:34

ありがとうございました。
fuzzball

2018/03/29 06:37

やりたいことと違ってましたか?
dounatsu

2018/03/29 21:19

多分できると思うのですが、今ちょっと頭がごっちゃになってて、自分のに適用するには時間がかかりそうなので、落ち着いた時にもう一回試してみます。ありがとうございます。
guest

0

ベストアンサー

GreenViewしかいじっていないので手抜きですが。

width0のダミーUIViewを設置して、そのBottomにGreenViewのBottomを合わせる方法を
ご自身で作られたものと組み合わせてみてはどうでしょうか?

github → https://github.com/tyobigoro/showUIView

識者の方に問題点など指摘していだだけたりすると嬉しいです。

swift

1import UIKit 2 3class ViewController: UIViewController { 4 5 // Bottom制約のOutlet接続 6   // greenBottom = redBottom 7 @IBOutlet weak var RedBottom: NSLayoutConstraint! 8 // greenBottom = yellowBottom 9 @IBOutlet weak var YellowBottom: NSLayoutConstraint! 10 // greenBottom = blueBottom 11 @IBOutlet weak var blueBottom: NSLayoutConstraint! 12 13 14 override func viewDidLoad() { 15 super.viewDidLoad() 16 // Do any additional setup after loading the view, typically from a nib. 17 } 18 19 20 override func viewDidLayoutSubviews () { 21 super.viewDidLayoutSubviews () 22 // 制約の初期設定 23 NSLayoutConstraint.deactivate([blueBottom]) 24 NSLayoutConstraint.deactivate([YellowBottom]) 25 NSLayoutConstraint.activate([RedBottom]) 26 self.view.layoutIfNeeded() 27 } 28 29 override func didReceiveMemoryWarning() { 30 super.didReceiveMemoryWarning() 31 // Dispose of any resources that can be recreated. 32 } 33 34 @IBAction func redBottom(_ sender: UIButton) { 35 // 制約の切り替え 36 NSLayoutConstraint.deactivate([blueBottom]) 37 NSLayoutConstraint.deactivate([YellowBottom]) 38 NSLayoutConstraint.activate([RedBottom]) 39 // アニメーション効果 40 UIView.animate(withDuration: 0.5, animations: { self.view.layoutIfNeeded() }, completion: nil) 41 } 42 43 @IBAction func yellowBottom(_ sender: UIButton) { 44 // 制約の切り替え 45 NSLayoutConstraint.deactivate([blueBottom]) 46 NSLayoutConstraint.deactivate([RedBottom]) 47 NSLayoutConstraint.activate([YellowBottom]) 48 // アニメーション効果 49 UIView.animate(withDuration: 0.5, animations: { self.view.layoutIfNeeded() }, completion: nil) 50 } 51 52 @IBAction func blueBottom(_ sender: UIButton) { 53 // 制約の切り替え 54 NSLayoutConstraint.deactivate([RedBottom]) 55 NSLayoutConstraint.deactivate([YellowBottom]) 56 NSLayoutConstraint.activate([blueBottom]) 57 // アニメーション効果 58 UIView.animate(withDuration: 0.5, animations: { self.view.layoutIfNeeded() }, completion: nil) 59 } 60 61} 62

投稿2018/03/28 20:04

編集2018/03/28 21:42
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

dounatsu

2018/03/28 21:04

ご回答ありがとうございます。 このやり方だと、緑のUIViewの高さをダミーのUIViewに合わせているので、緑のUIViewの中のコンテンツに応じて緑の高さを変えようとすると、いずれにせよ緑のUIViewのコンテンツの高さや制約を計算してダミーのViewの高さを出さないといけないということにならないでしょうか?
dounatsu

2018/03/28 22:02

度々申し訳ありません。少し考えたのですが、緑のVIewの一番下のコンテンツのBottomとダミーのBottomを合わせて高さを取得すれば、何とかやりたいことは達成できそうです。他に何か良い方法があればご教示頂ければ幸いです。
退会済みユーザー

退会済みユーザー

2018/03/28 22:02

中身を計算してダミーの高さを設定して、緑のボトムをそれに合わせるのかと。 緑のボトム = 赤・黄・青のトップじゃダメ?とおもってみたり(重なってる部分見えないし。) 赤・黄・青の高さは固定ですか?それとも中身があってその内容に応じてつど高さがかわりますか? 赤・黄・青は
退会済みユーザー

退会済みユーザー

2018/03/28 22:08

自分はダミー置きますが、SafeAreaHeightに対するrateだけでもよいのではないかとも思います。
dounatsu

2018/03/28 23:23

赤、黄、青の高さは固定ですが、実際は緑のViewの中に色々たくさん入っているので、今回はダミーを置いてちょっと試してみます。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問