2015-12-15 86 views
0

我對iOS很陌生並且還不太瞭解約束條件。我將一組動態視圖添加到我的視圖控制器,默認情況下,它包含頂部的滾動視圖和容器視圖。一切工作正常,我是管理使用,將它們添加下面互相以下:UIView以編程方式設置約束條件

TheView.frame = CGRectMake(5, CGFloat(position), self.view.frame.size.width-10, 40); //position is incremented so that they are below each other 

但是,當我打開手機,以景觀,意見不採取主視圖的寬度,使我增加了以下各方面的意見:

TheView.translatesAutoresizingMaskIntoConstraints = false; 
    let margins = contentView.layoutMarginsGuide // contentView is the container view 
    TheView.leadingAnchor.constraintEqualToAnchor(margins.leadingAnchor).active = true 
    TheView.trailingAnchor.constraintEqualToAnchor(margins.trailingAnchor).active = true 

此提出的意見動態地改變它們的寬度,當我旋轉設備,但他們現在重疊和我似乎無法找出如何我可以將它們放置低於對方喜歡他們是怎麼樣的。

UPDATE:

我除去滾動視圖和一切從故事板和編程添加滾動視圖和堆棧視圖。

在viewDidLoad中

ScrollView = UIScrollView() 
     ScrollView.translatesAutoresizingMaskIntoConstraints = false 
     view.addSubview(ScrollView) 

     view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|[scrollView]|", options: .AlignAllCenterX, metrics: nil, views: ["scrollView": ScrollView])) 
     view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|[scrollView]|", options: .AlignAllCenterX, metrics: nil, views: ["scrollView": ScrollView])) 


     stackView = UIStackView() 
     stackView.translatesAutoresizingMaskIntoConstraints = false 
     stackView.distribution = UIStackViewDistribution.EqualSpacing 
     stackView.spacing = 26.0 
     stackView.axis = .Vertical 
     ScrollView.addSubview(stackView) 


     ScrollView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|[stackView]|", options: NSLayoutFormatOptions.AlignAllCenterX, metrics: nil, views: ["stackView": stackView])) 
     ScrollView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|[stackView]|", options: NSLayoutFormatOptions.AlignAllCenterX, metrics: nil, views: ["stackView": stackView])) 

添加動態的觀點:

for loop... 

let Description = UILabel() 
stackView.addArrangedSubview(Description) 

let Value = UITextField() 
stackView.addArrangedSubview(Value) 

的視圖添加成功如前且有滾動。視圖也正在填充堆棧視圖(寬度),但仍不在橫向。

+0

在UIVewController級別也可以處理風景方向 - 請參閱「supportedInterfaceOrientation」 - 並在您的應用程序級別(請參閱您的應用程序目標上支持的方向)當您轉爲風景時,屏幕是否會隨着狀態欄一起旋轉? – Vinzzz

+0

抱歉延遲迴復..是的,但我不明白這是如何相關的。支持的界面方向是肖像,風景左和右 –

回答

3

你不能在同一時間:

  • 定義你的意見
  • 一個frame定義的一組約束這些意見

您做一個或另一個。

您似乎在使用iOS 9 API constraintEqualToAnchor,因此您可以將要堆疊的2個視圖放入UIStackView,這肯定是最簡單的解決方案。

如果您需要支持較舊版本的iOS(7,8),這隻意味着您沒有定義足夠的約束來放置您的視圖。 TheView.leadingAnchor.constraintEqualToAnchor(margins.leadingAnchor) =>這一個地方TheView左側(以及「領先」,因爲它可以取決於所顯示的語言的方向 - 例如它將適用於阿拉伯語) TheView.trailingAnchor.constraintEqualToAnchor(margins.trailingAnchor)約束另一方。

你有2個水平約束,所以你錯過了另外兩個約束,對於垂直軸。

其中的一個制約因素可能是topAnchorbottomAnchor(取決於是TheView - 順便說一句,大寫的實例變量是非常罕見:)

其他約束可能TheView和其他子視圖之間進行定義,像

let viewTop = NSLayoutConstraint(item: TheView, attribute: .Top, relatedBy: .Equal, toItem: scrollView, attribute: .Bottom, multiplier: 1, constant: 0),如果要放置TheView下面scrollView

謹防UIScrollView行爲有所不同與自動佈局。 你必須給它一個組約束其層次結構外部的意見(以約束滾動視圖bounds),你可以用另一套約束放置滾動視圖的子視圖(而這樣一來,約束其contentSize)(見Apple Technical Note on how to layout UIScrollView with constraints

+0

我試過堆棧視圖,但現在我不能添加約束和旋轉設備,添加的視圖不會佔用堆棧視圖的寬度 –

+0

stackView是約束的替代品,因此如果使用其中一個,則不需要定義任何約束。看'UiStackView'properties:'distribution'和'alignement',它們用來說明你的視圖應該如何填充空間,分別沿着stackView的軸線並垂直於它。 – Vinzzz

+0

謝謝你的時間@Vinzz。我會查找這個。但我的意思是我添加了堆棧視圖,並刪除了約束...旋轉設備和添加的視圖沒有填充視圖,所以我試圖加回約束和應用程序崩潰。 –

相關問題