2014-09-21 216 views
6

我使用故事板和Xcode 6來設計應用程序視圖,但我面臨的問題是:我想爲縱向和橫向模式分配不同的子視圖位置。例如:故事板和swift中的不同肖像/風景視圖

Portrait Landscape

既然現在我已經編程方式與willRotateToInterfaceOrientation和狀態欄實現了這一拿到iPad的方向。

使用Xcode 6,縱向和橫向的iPhone佈局是不同的,但iPad(普通,普通)的佈局是相同的。有可能通過約束來實現這些職位?

謝謝。

回答

7

是的,你可以用約束來做到這一點。

首先,您需要爲超級視圖創建約束,而不是最近的視圖。相鄰視圖將會改變位置,所以我們不希望約束與其他視圖相關。有關如何設置約束的示例,請參見下面的屏幕截圖。

Constraint Setup

接下來,鏈接你會被修改,以IBOutlets的限制,所以我們可以通過編程修改它們。舉例來說,這些將是約束條件:

@IBOutlet var greenViewTrailingConstraint: NSLayoutConstraint! 
@IBOutlet var greenViewBottomConstraint: NSLayoutConstraint! 

@IBOutlet var redViewTopConstraint: NSLayoutConstraint! 
@IBOutlet var redViewLeadingConstraint: NSLayoutConstraint! 
@IBOutlet var redViewBottomConstraint: NSLayoutConstraint! 

@IBOutlet var blueViewTrailingConstraint: NSLayoutConstraint! 
@IBOutlet var blueViewTopConstraint: NSLayoutConstraint! 
@IBOutlet var blueViewLeadingConstraint: NSLayoutConstraint! 

最後,基於UIInterfaceOrientation更新約束常量。同樣,使用您的示例,代碼看起來是這樣的:

override func willRotateToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval) { 
    let padding: CGFloat = 16.0 

    // since we're calling this before the rotation, the height and width are swapped 
    let viewHeight = self.view.frame.size.width 
    let viewWidth = self.view.frame.size.height 

    // if landscape 
    if UIInterfaceOrientationIsLandscape(toInterfaceOrientation) { 
     greenViewTrailingConstraint.constant = (viewWidth/2.0) + (padding/2.0) 
     greenViewBottomConstraint.constant = padding 

     blueViewTopConstraint.constant = (viewHeight/2.0) + (padding/2.0) 
     blueViewTrailingConstraint.constant = padding 
     blueViewLeadingConstraint.constant = (viewWidth/2.0) + (padding/2.0) 

     redViewTopConstraint.constant = padding 
     redViewBottomConstraint.constant = (viewHeight/2.0) + (padding/2.0) 
     redViewLeadingConstraint.constant = (viewWidth/2.0) + (padding/2.0) 
    } else { // else portrait 
     greenViewBottomConstraint.constant = (viewHeight/2.0) + (padding/2.0) 
     greenViewTrailingConstraint.constant = padding 

     blueViewTopConstraint.constant = (viewHeight/2.0) + (padding/2.0) 
     blueViewTrailingConstraint.constant = (viewWidth/2.0) + (padding/2.0) 
     blueViewLeadingConstraint.constant = padding 

     redViewLeadingConstraint.constant = (viewWidth/2.0) + (padding/2.0) 
     redViewBottomConstraint.constant = padding 
     redViewTopConstraint.constant = (viewHeight/2.0) + (padding/2.0) 
    } 
} 
+0

很好的解決方案! !但是,我只是想知道在設備旋轉過程中以編程方式添加和刪除約束是否好。 – 2015-05-19 06:38:56

+0

@RashmiRanjanmallick,好問題!但是,我們不添加/刪除約束。我們只是修改它們的常量。修改約束常量是常見操作,特別是在UIView動畫或設備旋轉中。 – 2015-05-19 17:58:40

+0

謝謝,我只是想知道他們爲什麼沒有像選擇肖像模式一樣製作故事板並設置肖像佈局,並選擇了橫向模式並設置了橫向佈局。 – fullMoon 2017-03-01 10:02:18

1

我知道這是一個老的文章,但,只是info.I嘗試下面的步驟,它是按預期工作。

Step1。選擇視圖控制器,從大小類控件中選擇任意。 並在此模式下添加視圖。 Any Mode Step2。將模式更改爲從尺寸等級控制中縱向顯示所有iPhone,爲縱向模式的視圖添加約束。 Potrait mode Step3。類似地更改模式以橫置所有iPhone,爲橫向模式的視圖添加約束。

請注意:這些約束現在是獨立的縱向和橫向

0

按加號「+」恆約束的旁邊,並添加變化對於不同的屏幕:

enter image description here