問題は簡単に聞こえますが、それは私を夢中にさせています。私はIBでiBagと呼ばれる白いビューを作成しました。制約により、そのサイズは画面サイズに依存します。
次に、プログラムで新しい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)
私も限界を試みました、しかしそれは助けにはなりませんでした。制約を使用して問題を解決できますが、何が問題なのかを理解したいと思います。
非常に多くの答えがあり、誰も何が悪いのかを説明していません。
試してみます。
newView
のフレームをスーパービューフレームに設定していますbefore自動レイアウトエンジンがスーパービューの位置とサイズを決定し始めました。したがって、superviews
フレームを使用するときは、その初期フレームを使用しています。ほとんどの場合、これは正しくありません。
正しく行うには、3つの方法があります。
newView
に自動レイアウト制約を使用する
newView
メソッドでviewDidLayoutSubviews
sフレームを設定します。これは、自動レイアウトエンジンがフレームの実際の値を決定し終えたときに呼び出されます。 (注:このメソッドは複数回呼び出すことができます)
newView
の自動サイズ変更マスクを設定するこれを試して:
Swift 1および2:
newView.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
Swift 3 +:
newView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
それが機能しない場合は、これも:
iBag.autoresizesSubviews = true
これを試して
_subview.frame = parentView.bounds
_
_subview.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
_
parentView.addSubview(subview)
これを試して、
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を使用するか、どこでも使用しないです。子ビューではなく親ビューで自動レイアウトを使用することは悪い習慣です。
これはあなたを助けるかもしれません
override func viewDidLayoutSubviews() {
let newView = UIView()
newView.frame = iBag.bounds
newView.addConstraints(iBag.constraints)
newView.backgroundColor = UIColor.redColor()
iBag.addSubview(newView)
}
これがお役に立てば幸いです。
これはうまくいくかもしれません:-
subview.bounds.size = parentView.bounds.size
subview.center = parentView.center
しかし、あなたの場合、CGRect内のwidth
とheight
は
width: parentView.bounds.size.width
height: parentView.bounds.size.height
そして、その親にサブビューとして追加します。
制約を使用しないことは、おそらく問題です。ストーリーボード/ペン先がAutoLayoutを使用するように設定されている場合(デフォルトではオン)、フレーム/境界の設定はAutoLayoutシステムによってオーバーライドされ、制約を使用してレイアウトを正しく見えるようにする必要があります。 (または、自動サイズ変更マスクを制約に変換するフラグを設定します。そのフラグが何と呼ばれるか覚えていませんが、現時点ではそれを見つけることができないようです。)
Viewdidloadでビューを設定している場合は、viewdidappearで呼び出して、画面サイズに応じてビューの元のフレームをキャプチャします
このコードを試してください:
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)