2017-03-09 77 views
0

假設我正在創建一個計算器,並且我知道我將支持最多20個數字的肖像和40個數字的橫向。如何在iOS/Swift中爲指定寬度創建固定寬度標籤?

如何創建或調整標籤以顯示最大數字位數,以便在我們添加或刪除結果中的數字時不會調整大小?

代碼我已經嘗試過;

let labelFont : UIFont = resultDigitsLabel.font; 
let originalString : String = "00000000000000000000"; 
let nsString : NSString = originalString as NSString; 
var labelSize : CGSize = nsString.size(attributes: [NSFontAttributeName: labelFont]); 
labelSize.height = 0; 
let labelRect : CGRect = resultDigitsLabel.frame; 
let newFrame :CGRect = CGRect(origin: labelRect.origin, size: labelSize); 
resultDigitsLabel.frame = newFrame; 

resultDigitsLabel.layer.borderWidth = 0.5; 
resultDigitsLabel.layer.cornerRadius = 5.0; 

到目前爲止沒有運氣,原來的幀復位不會出現調整標籤和我添加或刪除數字框架(通過觀看境)也重新調整。

我沒有看到任何大小的約束,應該創建約束而不是通過更改框架來設置寬度?

任何其他提示?

謝謝。

+0

標籤的最大寬度可以是任意點的屏幕寬度。因此,添加一個標籤並在標籤上添加尾隨和前導約束,將約束常量設置爲0.這將使其覆蓋整個屏幕寬度,並將字符數限制爲縱向20個,橫向40個,全部爲 –

回答

0

約束是最好的方法。給您的標籤分配LeadingTrailing約束,並給予超級視圖equal width。 它將支持橫向和縱向模式。

+0

是的,添加約束做了訣竅,用於在我的答案中回答並提供代碼示例。 –

0

嘗試添加該屬性標籤: - resultDigitsLabel.adjustsFontSizeToFitWidth =真

0

你要計算20位或40位的框架,並建立與框架的UILabel幀。

let digits:NSString = "99999999999999999999" as NSString 
let idealFrame= digits.boundingRect(with: CGSize(width: CGFloat.infinity, height: 30), options: .usesLineFragmentOrigin, attributes: [NSFontAttributeName:labelFont], context: nil).size 

現在你可以使UILabel這個框架。

+0

謝謝,但此代碼段產生與我的段中nsString.size行相同的值。問題仍然是屏幕標籤不斷調整大小,因爲我們增加了標籤中的位數。 –

0

根據thewarri0r9上面的添加約束做了竅門;

let screenSize: CGRect = UIScreen.main.bounds; 
    let screenWidth = screenSize.width; 
    let constraintMargin = (screenWidth - labelSize.width)/2; 
    let leadingConstraint = NSLayoutConstraint(item: targetDigitsLabel, attribute: .leading, relatedBy: .equal, toItem: view, attribute: .leading, multiplier: 1, constant: constraintMargin); 
    let trailingConstraint = NSLayoutConstraint(item: targetDigitsLabel, attribute: .trailing, relatedBy: .equal, toItem: view, attribute: .trailing, multiplier: 1, constant: constraintMargin * -1); 
    view.addConstraints([leadingConstraint, trailingConstraint]);