2017-12-30 38 views
0

私はUIViewControllerに表示されるシミュレーションを制御するために、次のUIKit要素を追加しています。私は多くの配置コードを書く必要があると思っていましたが、代わりにすべてのデバイスは完全には何も表示されません...私の質問はなぜですか?UIKitViewにオブジェクトを追加すると、オブジェクトの配置とサイズが完全になるのはなぜですか?

let menuButton = UIButton() 
let statusLabel = UILabel() 
let segmentedLabel = UISegmentedControl(items: ["None", "Glow", "Cloud"]) 
func initializeUI() { 
    //The menu button that opens up the options for the simulations 
    menuButton.layer.borderColor = UIColor.lightGray.cgColor 
    menuButton.layer.borderWidth = 1 
    menuButton.layer.cornerRadius = 5 
    menuButton.layer.backgroundColor = UIColor.darkGray.cgColor 
    menuButton.showsTouchWhenHighlighted = true 
    menuButton.imageView?.contentMode = UIViewContentMode.scaleAspectFit 
    menuButton.setImage(UIImage(named: "hamburger.png"), for: UIControlState.normal) 
    menuButton.addTarget(self, action: #selector(menuPress), for: UIControlEvents.touchDown) 
    view.addSubview(menuButton) 

    //Will display the status of the simulation 
    statusLabel.text = "Particle Simulation" 
    statusLabel.textColor = UIColor.darkGray 
    view.addSubview(statusLabel) 

    //Will display visual options 
    view.addSubview(segmentedLabel) 
} 

各要素のサイズは完全であり、重複しません。ラベルは左下隅にあり、ボタンは右下にあり、セグメント化されたビューは(私のランドスケープアプリケーションの)左上隅にあります。

これらのオブジェクトをプログラムで配置するには、どうすればいいですか?要素には、私が働くことができる属性の位置はありません。もし私がmenuButton.frame.size.height *= 20のような何かをすれば、メニューボタンを超高にしません。

+0

それがUIKitの振る舞いであることを示します。私が見ていないこの効果を生むコードが書かれています。 –

答えて

0

あなたの例にあるすべてのUIアイテムが「固有の」コンテンツサイズを持ち、独自のフレームを作成できるという理由からです。同じように標準のUIViewを追加すると、あなたは不運になります。また、ビューは、自動サイズ変更マスク(スプリングとストラットとも呼ばれます)を使用して、初期フレームに基づいて独自の制約を作成しています。

最後にアイテムを置くと、フレームが直接設定されます。ちょうど数学。がんばろう。

本質的なコンテンツサイズを理解するために非常に重要です。いくつかのフレームの変更は自動的に制約をオフにする必要がありますが、これは通常の場合ではなく、あなたのボタンに問題がある可能性があり、私は私のミスの思考をしたので、オフトピックとして、私はこの質問を閉じるために投票しています

UIView.translatesAutoresizingMaskIntoConstraints = false 
+0

私はアイテムがどこにある必要があるのか​​を計算することができますが、その位置とサイズを編集するために使用するプロパティは何ですか?私はあなたがそれを編集できるようになるプロパティを見つけることができません。 –

+0

私はUIButtonの変換と中心の属性を編集しましたが、セットの表示が必要な場合でも変わっていませんし、サブビューとして追加した後に変換を行います。 –

関連する問題