2015-10-16 38 views
1

這看起來應該是更容易,它目前正在。iOS 9 Autolayout:一個居中的方形

我試圖在任何iOS設備中繪製縱橫比爲1:1(方形)的UIView,而不管方向如何。

欲瞭解詳情: 我的看法有一個繪製,更新timeInterval。我正在使用全屏視圖並在每次繪製時計算我的正方形。在方向轉變的時候,整個視野都變成了地獄。我認爲如果視圖是方形的,我可以相信方向改變動畫。

我的限制已經多次失敗,這就是爲什麼這似乎像它應該是更容易:

View (Square) 
    Constraints 
     aspect 1:1 
Constraints 
    View.centerX = centerX 
    View.centerY = centerY 
    View.leading ≥ leadingMargin + 5 @ 800 
    View.top ≥ Top Layout Guide.bottom + 5 @ 800 
    trailingMargin ≥ View.trailing + 5 @ 800 
    Bottom Layout Guide.top ≥ View.bottom + 5 @ 800 

我有250
內容抱死Prioity我有750

內容抗壓

這留下了約束錯誤:
- 缺少約束:需要約束:X位置或寬度
- 缺少約束:需要約束:Y位置或高度t

我的困惑是我無法鎖定到一個維度,因爲旋轉時我需要鎖定到另一個維度。

如上所述...這似乎應該更容易。 以較薄的維度以5的邊框居中放置一個Square UIView。
(縱向5個,縱向5個,上方橫向5個)

建議熱烈讚賞,解釋將是無法幫助的。

enter image description here

+1

您希望廣場有可用的最大尺寸,仍然是方形的?然後集中它?確切地說,是 – luk2302

+0

@ luk2302。 –

+0

您是否有工作解決方案並尋找更簡單的版本,或者您是否要求提供任何工作解決方案? – luk2302

回答

0

方需要指定它的大小。

Square centerX = Parent centerX 
Square centerY = Parent centerY 

在這一點上,視圖居中,但沒有什麼可以讓autolayout決定視圖的大小。

Square width = 200 
Square aspect = 1 

如果您希望方形是父寬度的一部分,那也很簡單。

Square width = Parent width * 0.5 //or any other multiplier 

您需要調整寬度約束,具體取決於希望廣場在橫向上的外觀。

要獲得「可能的最大正方形」,可以以編程方式將寬度約束設置爲min(parentWidth, parentHeight)並調整方向。

或者,leading, trailing, centerX, centerY, and aspect應該會得到類似的結果。任何一組約束都需要能夠在邏輯上確定位置和大小而沒有歧義。

更新
在IB:

Square centerX = Parent centerX 
Square centerY = Parent centerY 
Square aspect = 1 

在代碼:

if parent width > parent height 
Square width = parent height - 2 * margin 

else 
Square width = parent width - 2 * margin 

調整此上旋轉

+0

Stefan,你能否澄清這是在IB約束還是在代碼中完成的。爲了清晰起見,我編輯了上述內容。 –

+0

@LordAndrei我更新了我的答案。對我來說最明顯的解決方案是在IB中添加簡單和固定的約束條件,並在代碼中添加一個約束條件,以便可以改變/很棘手的方形寬度。有可能有很多其他方式來做到這一點,但這似乎最明顯。 –

+1

需要注意的一件事是,IB將顯示該視圖的錯誤,因爲沒有定義寬度/高度。沒關係;您將以編程方式添加缺失的約束。或者你可以在IB中爲肖像添加約束,並在旋轉時調整它以刪除編輯xib/storyboard時的錯誤。 –

1

這裏是我只是放在一起的方法。我無法完全在IB中完成它,但至少運行時代碼僅限於激活/停用約束,而不必添加/刪除或計算/更改任何大小。

在我的故事板我有以下限制

  • 中心X
  • 芯Y
  • 前導空格內的UIView到上海華= 5,優先級= 999
  • 尾隨空間的SuperView = 5,優先級= 999
  • 超級視圖的頂部空間= 5,優先級= 1000
  • 超級視圖的底部空間= 5,優先級= 1000

我創建IBOutlets在過去四年的限制,這是我的看法控制器 -

class ViewController: UIViewController { 

    @IBOutlet var leadingConstraint: NSLayoutConstraint! 
    @IBOutlet var trailingConstraint: NSLayoutConstraint! 
    @IBOutlet var topConstraint: NSLayoutConstraint! 
    @IBOutlet var bottomConstraint: NSLayoutConstraint! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    override func viewWillAppear(animated: Bool) { 
     super.viewWillAppear(animated) 
     self.setConstraintsForSize(self.view.frame.size) 
    } 

    override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) { 
     self.setConstraintsForSize(size) 
    } 

    func setConstraintsForSize(size:CGSize) { 
     if (size.width > size.height) { 
      self.leadingConstraint.active=false; 
      self.trailingConstraint.active=false; 
      self.topConstraint.active=true; 
      self.bottomConstraint.active=true; 
     } else { 
      self.leadingConstraint.active=true; 
      self.trailingConstraint.active=true; 
      self.topConstraint.active=false; 
      self.bottomConstraint.active=false; 
     } 
    } 
} 

這適用於iPhone和iPad,包括iPad的在窗口/分屏模式