2016-11-06 57 views
0

這聽起來不太難,但經過數小時的嘗試,我無法得到適當的解決方案。如何設置NSLayoutAnchor生成寬高比爲1:1的居中子視圖

問題:我想設置限制(與類NSLayoutAnchor),以獲得一個子視圖(colorImageView)beeing 在上海華居中,以1:1的長寬比:1 AND總是在最大尺寸可能在超視圖中,有時寬度>高度或高度>寬度。

實施例1:SuperViewSize =寬度:80,高度= 100 - >子視圖應該得到的高度和寬度80,並在(40/50)

居中

實施例2:SuperviewSize =寬度: 60,高度= 50 - >子視圖應得到高度和寬度爲50並居中在(30/25)

我不想要/並且它不能解決問題/硬編碼widthConstraint = min(superviewWidth,superviewHeight ),因爲在創建子視圖時,superviews界限並未最終定義 - >所以我需要一個約束。

這是我嘗試到目前爲止(人仍下落不明約束,以最大可能變化的上海華盈中設置的高度和寬度:

// CREATE CONSTRAINTS(center in SuperView) 
colorImageView.centerXAnchor.constraint(equalTo: self.centerXAnchor).isActive = true 
colorImageView.centerYAnchor.constraint(equalTo: self.centerYAnchor).isActive = true 

// CREATE CONSTRAINTS (ratio 1:1) 
colorImageView.widthAnchor.constraint(equalTo: colorImageView.heightAnchor, multiplier: 1.0).isActive = true 

我會很感激的提示,該怎麼做。感謝提前:))

+0

我更新了斯威夫特3語法答案。 – vacawama

回答

3

以使這項工作,關鍵是要設置colorImageView等於它的父的寬度,但與750優先級(而不是默認的1000)的寬度。

然後將colorImageView的高度設置爲lessThanOrEqualTo其超視圖的高度。

自動佈局將盡最大努力滿足這兩個新的約束條件。

當視圖的寬度大於其高度時,它將無法使寬度等於視圖的寬度,但這是可以的,因爲優先級爲750.它將使其儘可能大違反了其他完全優先的約束條件。

當視圖的高度大於其寬度時,它將能夠滿足所有約束,因爲colorView的高度爲lessThanOrEqualTo視圖的高度。

import UIKit 

let view = UIView(frame: CGRect(x: 0, y: 0, width: 80, height: 100)) 
view.backgroundColor = .red 

let colorImageView = UIView() 
colorImageView.translatesAutoresizingMaskIntoConstraints = false 
colorImageView.backgroundColor = .yellow 

view.addSubview(colorImageView) 

// CREATE CONSTRAINTS(center in SuperView) 
colorImageView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true 
colorImageView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true 

// CREATE CONSTRAINTS (ratio 1:1) 
colorImageView.widthAnchor.constraint(equalTo: colorImageView.heightAnchor, multiplier: 1.0).isActive = true 

let widthConstraint = colorImageView.widthAnchor.constraint(equalTo: view.widthAnchor) 
widthConstraint.priority = 750 
widthConstraint.isActive = true 

colorImageView.heightAnchor.constraint(lessThanOrEqualTo: view.heightAnchor).isActive = true 

view.layoutIfNeeded() 

view.frame = CGRect(x: 0, y: 0, width: 60, height: 50) 
view.layoutIfNeeded() 

這在操場運行:

enter image description here

+0

謝謝! - >這使它運行! – LukeSideWalker

相關問題