web-dev-qa-db-ja.com

プログラムで制約なしに親と一致するようにUIViewサイズを設定する方法

問題は簡単に聞こえますが、それは私を夢中にさせています。私はIBでiBagと呼ばれる白いビューを作成しました。制約により、そのサイズは画面サイズに依存します。

enter image description here

次に、プログラムで新しいUIViewを作成し、このコードによって同じサイズと位置でサブビューとしてiBagに追加します

let newView = UIView()
newView.frame =  (frame: CGRect(x: 0, y: 0, width: iBag.frame.width, height: iBag.frame.height))
newView.backgroundColor = UIColor.redColor()
iBag.addSubview(newView)

enter image description here

私も限界を試みました、しかしそれは助けにはなりませんでした。制約を使用して問題を解決できますが、何が問題なのかを理解したいと思います。

13
Seifolahi

非常に多くの答えがあり、誰も何が悪いのかを説明していません。

試してみます。

newViewのフレームをスーパービューフレームに設定していますbefore自動レイアウトエンジンがスーパービューの位置とサイズを決定し始めました。したがって、superviewsフレームを使用するときは、その初期フレームを使用しています。ほとんどの場合、これは正しくありません。

正しく行うには、3つの方法があります。

  • newViewに自動レイアウト制約を使用する

  • newViewメソッドでviewDidLayoutSubviewssフレームを設定します。これは、自動レイアウトエンジンがフレームの実際の値を決定し終えたときに呼び出されます。 (注:このメソッドは複数回呼び出すことができます)

  • newViewの自動サイズ変更マスクを設定する
21
Shadow Of

これを試して:

Swift 1および2:

newView.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]

Swift 3 +:

newView.autoresizingMask = [.flexibleWidth, .flexibleHeight]

それが機能しない場合は、これも:

iBag.autoresizesSubviews = true

20
Vic

これを試して

_subview.frame = parentView.bounds_

_subview.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]_

parentView.addSubview(subview)

9
Cjay

これを試して、

 override func viewDidLayoutSubviews() {


    newView.frame =  (frame: CGRect(x: 0, y: 0, width: iBag.frame.width, height: iBag.frame.height))

}

または、viewWillAppearまたはviewDidAppearを使用してフレームを設定できます。

viewDidloadのiBagのフレームは、インターフェイスビルダー(ストーリーボード)と同じであるためです。これで、制約と実行するデバイスのサイズに応じて変更されます。したがって、viewDidloadでは、新しいビューは古いフレームを取得し、フレームは変更しません。したがって、viewDidLayoutSubviewsまたはviewWilAppearを使用することをお勧めします。

第二に、どこでもautolayoutを使用するか、どこでも使用しないです。子ビューではなく親ビューで自動レイアウトを使用することは悪い習慣です。

3
Lion

これはあなたを助けるかもしれません

override func viewDidLayoutSubviews() {

    let newView = UIView()
    newView.frame = iBag.bounds
    newView.addConstraints(iBag.constraints)
    newView.backgroundColor = UIColor.redColor()
    iBag.addSubview(newView)

}

これがお役に立てば幸いです。

2
Nirav D

これはうまくいくかもしれません:-

subview.bounds.size = parentView.bounds.size

subview.center = parentView.center

しかし、あなたの場合、CGRect内のwidthheight

width: parentView.bounds.size.width
height: parentView.bounds.size.height

そして、その親にサブビューとして追加します。

1
Ccr

制約を使用しないことは、おそらく問題です。ストーリーボード/ペン先がAutoLayoutを使用するように設定されている場合(デフォルトではオン)、フレーム/境界の設定はAutoLayoutシステムによってオーバーライドされ、制約を使用してレイアウトを正しく見えるようにする必要があります。 (または、自動サイズ変更マスクを制約に変換するフラグを設定します。そのフラグが何と呼ばれるか覚えていませんが、現時点ではそれを見つけることができないようです。)

0
Duncan C

Viewdidloadでビューを設定している場合は、viewdidappearで呼び出して、画面サイズに応じてビューの元のフレームをキャプチャします

0
shubh14896

このコードを試してください:

let newView = UIView()
newView.frame =  (frame: CGRect(x: iBag.frame.Origin.x, y: iBag.frame.Origin.y, width: iBag.frame.size.width, height:  iBag.frame.size.height))
newView.backgroundColor = UIColor.redColor()
iBag.addSubview(newView)
0