2015-10-28 34 views
7

我正在通過斯坦福冬季2015 Swift/iOS課程,並在做任務時遇到了一種行爲I我想改變。UILabel文本屬性設置爲零或「」使UILabel從視圖中消失(Swift/Autolayout/iOS9.1)

我使用Autolayout在視頻中描述(使顯示引腳爲前導和尾隨視圖邊緣)和計算器應用程序「顯示」UILabel罰款初始值爲0,每當用於設置它的值(a字符串)是非零和非「」。

如果它是零或「」,整個UILabel消失。我想要做的是在沒有值顯示或不正確的計算結果爲零時「清除」顯示。

任何提示誰來處理這個問題? 「清除」一個UILabel而不改變它的屏幕尺寸?


編輯(感謝羅布) 的的UILabel具有以下限制 1.按住Option鍵並拖動左含有的UIView,選擇「龍頭」的東西(在上班通勤不能檢查尚未對確切的措辭 2.與(1)相同的方法,除了拖動到右邊緣並選擇「拖尾」 3.選項單擊並拖動到視圖頂部,選擇「垂直」菜單選項 4.與3)除了拖拽到GUI上的UILabel下面的UIButton。

使用這些設置,包含數字的標籤始終爲v可見的,並且(如果明白,將着色它來驗證)在屏幕上延伸,即使文本沒有。

只要UILabel的內容不爲空,佈局在外形和橫向上看起來都是正確的。如果是空的,它似乎「縮小到適合」,以至於下面的按鈕向上移動。

自90年代中期以來,我是一名C++開發人員,但我沒有多少用戶界面經驗,在iOS/Swift開發中只有幾個星期的經驗。

謝謝!

+0

編輯您的問題描述你有你的標籤視圖設置來控制其位置和大小的約束。 –

+0

你試過調用'label.sizeToFit()'嗎? – Pranav

+0

您是否試過使if語句返回:「」(清除標籤)如果countDown定時器== 0? @Varsuuk – lukaivicev

回答

1

您總是可以給UILabel一個最小寬度和最小高度或約束條件來保存標籤的左側和右側。這應該使標籤不會將尺寸更改爲零。

+0

謝謝,我會在Mac上檢查這一點,但是有沒有辦法讓iOS控制的最小寬度爲視圖寬度?我曾經相信這是當選項從控件左右拖拽到左邊和右邊時我正在做的事情,但我是新的,也許它是全寬,但也許它的高度,正如你所提到的那樣,可能會縮小 - 我將着色UILabel從視圖獲取更多信息 – Varsuuk

+0

我認爲你需要做的是給它是最低的高度,然後 – Moriya

+0

謝謝@animal,正在想,但用我粗魯的大拇指在iPad上打字讓我在上一個評論中輸入一行太快了,將會檢查並更新 – Varsuuk

1

在我來說,我最終使其成爲一個空間,所以「」代替「」

0

使用在Interface Builder >> Identity inspector >> Custom Class >> Class分配給覆蓋UILabel固有內容尺寸定製UILabel類。

無需創建任何多餘的自動佈局約束。

斯威夫特:

class UILabelNonCompressible: UILabel 
{ 
    private static let NonCompressibleInvisibleContent = " " 

    override var intrinsicContentSize: CGSize 
    { 
     if /* zero-width */ text == nil ? true : text!.isEmpty 
     { 
      // prefer mirror-and-calculate over modify-calculate-restore due to KVO 
      let doppelganger = createCopy() 

      // calculate for any non-zero -height content 
      doppelganger.text = UILabelNonCompressible.NonCompressibleInvisibleContent 

      // override 
      return doppelganger.intrinsicContentSize 
     } 
     else 
     { 
      return super.intrinsicContentSize 
     } 
    } 
} 

您還需要"How do copy for UILabel?"

extension UILabel 
{ 
    func createCopy() -> UILabel 
    { 
     let archivedData = NSKeyedArchiver.archivedData(withRootObject: self) 
     return NSKeyedUnarchiver.unarchiveObject(with: archivedData) as! UILabel 
    } 
}