2017-03-08 8 views
0

高さが300pxに設定され、画面の下部に設定されたラベルが画面に表示され、UIViewを作成したいそれは正確にそれを覆います。私が使用するコードは新しいview.frame.yとlabel.frame.yが一致しない

let theFrame = CGRect(x: myLabel.frame.minX, y: myLabel.frame.minY, width: myLabel.frame.width, height: myLabel.frame.height) 

newVu = UIView(frame: theFrame) 
let newColor = UIColor(colorLiteralRed: 0.5, green: 0.5, blue: 1, alpha: 0.5) 
newVu.backgroundColor = newColor 
self.view.addSubview(newVu) 

私は新しいUIViewのラベルより約20ポイント高いシフトしている取得した結果です。 (編集:GeorgeGreenがコメントに役立つように、これは、Top Layout Guideの下部に拘束されているVertical StackView内にラベルがあるためです。したがって、ラベルのYはスタックの上部を基準にしています画面の上部ではなく、画面であることを確認してください))作業中に参照フレームが異なるのは明らかですが、すべてを同じ参照フレームに入れるためには何が必要ですか?編集:または、別の方法で尋ねたラベルの "絶対" X座標とY座標を取得する方法の画面に埋め込まれているビューの数に関係なく、正確にオーバーレイするために新しいビューをドロップしますか? IBで

オリジナル画面:コードの

original screen in IB

結果は、(新しいビューは半透明であり、下部に黄色の帯に注意してください):

result of the code -- note yellow band at the bottom

+0

これらのコードはどこに追加しましたか? –

+0

@ LuanTranこのコードは、viewWillLayoutSubviews()から呼び出され、ビューが最初に表示されたときに起動され、次にviewWillTransition()からも呼び出され、向きが縦長から横向きに戻ったときにサイズをリセットします。後者は実際には新しいビューを作成するのではなく、newView.frameを更新しますが、すべての場合に黄色のバンドが表示されます。 – ConfusionTowers

+0

あなたのコードを 'viewDidLayoutSubviews()'に移動して、システムが何らかの自動挿入をしたことがありますか?また、私は 'myLabel'が' self.view'の直接のサブビューであると仮定します。興味のないところでは、単にフレームセットの 'newVu = UIView(frame:myLabel.frame)'(なぜならこれは問題を引き起こしていません)でしょうか? –

答えて

1

することができますが表示されるラベルの位置を

viewWillLayoutSubviews 

がサブビューをレイアウトする任意の時間を呼び出しますので、あなたは

viewDidAppear 

にそれを移動する必要があります。それが初めて実行されたときには気になりましたが、あなたの「マイラーベル」は正しい位置にレイアウトされていませんでした。

Apple document

+0

私は 'viewWillLayoutSubviews'がこれよりも早いことに同意しますが、' view ** Did ** LayoutSubviews'(@George Greenの提案)や 'viewDidAppear'のように後で呼び出すと結果は変わりません私は新しいビューを間違って配置してきている。 – ConfusionTowers

+0

試しましたか?私は自分のプロジェクトでテストしたところ、うまくいった。 –

+0

私はしました - 問題は、ラベルが垂直スタックビュー内にあるので、私はそのコードを呼び出すときに、同じ結果を生成します。ラベルが縦型スタックビュー(Top LayoutGuideの一番下にあるもの)にない場合、おそらくあなたが以前のように呼び出されたとしても、物事はあなたのために正しく機能します。グラフィックの真上の質問の編集をご覧ください。 – ConfusionTowers

0

「画面でXとラベルのY座標 『絶対』どのように私が得ることができる」のご質問については、回答は2番目のパラメータとしてnilを渡し、UIView.convert(_:to:)を使用することです。 (これは、含まれるウィンドウの起点に相対的な座標を生成しますが、実用的な目的はおそらく "スクリーン"の意味です)。

関連する問題