2014-03-27 34 views
22

a simple iPhone appviewDidLoad顯示一個字母瓦(帶圖像和2個標籤定製UIView)通過下面的代碼:使字體與UILabel一起生長(通過自動佈局調整大小) - 如何在Interface Builder中執行此操作?

app screenshot

DraggedTile *tile = [[[NSBundle mainBundle] loadNibNamed:@"DraggedTile" 
                owner:self 
               options:nil] firstObject]; 
tile.frame = CGRectMake(10 + arc4random_uniform(100), 
         10 + arc4random_uniform(100), 
         kWidth, 
         kHeight); 
[self.view addSubview:tile]; 

這工作不錯,但我想提出的信瓷磚生長 - 當我提供更大的寬度和高度參數到CGRectMake

因此,在Xcode 5.1界面生成器中,我打開DraggedTile.xib並啓用「自動佈局」。

然後,對於imageletter我添加約束的父,左邊,頂部,右邊,底邊。

letter標籤我還設置 「線條」 爲0, 「內容壓縮性優先」 到1000(這裏fullscreen 1fullscreen 2):

Xcode screenshot

Xcode screenshot

然後我修改代碼使用更大的寬度和高度:

tile.frame = CGRectMake(10 + arc4random_uniform(100), 
         10 + arc4random_uniform(100), 
         2 * kWidth, 
         2 * kHeight); 

H ERE結果如下:

app screenshot

兩個背景imageletter標籤似乎已經成長爲意。

但是,標籤的字體大小還沒有增長。

我搜索了四周,我認爲我需要類似tile.letter.adjustsFontSizeToFitWidth = YES。但在同一時間,我無法用「自動佈局」是在使用它...

所以我的問題是如果在「Interface Builder中」任何可用的選項,以使字體大小成長以及?

UPDATE:

我已經試過ismailgulek的建議,字體大小設置爲在Interface Builder 200 in the codetile.letter.adjustsFontSizeToFitWidth = YES和它看起來很有希望(這裏fullscreen):

Xcode screenshot

但我現在遇到了在Interface Builder中將40px設置爲letter.bottom約束的問題。但是如果我需要更大的瓷磚框架呢?有沒有一種方法可以在該約束中使用百分比而不是絕對像素值?

而另一個問題是如果可以在接口構建器中設置adjustsFontSizeToFitWidth某處,還是必須使用源代碼?我試着加入一鍵「用戶定義的屬性運行」 - 但隨後的應用程序崩潰,在運行時:

Xcode screenshot

+0

您應該爲其他標籤設置約束條件。 – vin

+0

但是你的其他標籤似乎看起來錯了,你想這樣嗎? – vin

+0

我會稍後更正另一個標籤的位置。現在我正在詢問字體大小。 –

回答

25

adjustsFontSizeToFitWidthUILabel的屬性不會長大字體大小,它只是用於根據文檔減少:通常,標籤文本是用您在font屬性中指定的font繪製的。但是,如果此屬性設置爲YES,並且文本屬性中的文本超過了標籤的邊界矩形,接收器將開始減小字體大小,直到字符串適合或達到最小字體大小。

如果你設置字體大小足夠大(比如200),並設置adjustsFontSizeToFitWidthYES,我想你會得到有趣的有價值的研究成果。

並且不要忘記將Baseline設置爲Align Centers,否則您的文本可能無法正常顯示。

請通知我們您的結果。

+2

這就是我一直在做的事情,在小屏幕上的文字上方創建了太多的空間。然而,我完全忽略了'對齊中心',正如你所描述的那樣,這對我的問題確實有幫助,因爲我只是在標題中做這個。謝謝! – RoLYroLLs

0

字體就不會自動增長。
你應該自己增加/減少它,在IB或以編程方式。

+0

這是不正確的。請參閱下面的答案。 – ishahak

2

您可以通過在故事板中設置Autoshrink來完成您想要的操作。當屏幕尺寸變小時,它將使標籤縮小到最小比例/顯式尺寸。讓它在最大的屏幕尺寸上工作,然後確保它在故事板預覽中縮小到所需的尺寸。

1

您可以使用您自己的派生類替換Interface Builder中的類,並在其中調整大小。

例子:

/** 
MYLabel does exactly the same like UILabel, except that the font size will automatically shrink 
if the code is executed on an iPhone. 
*/ 

class MYLabel: UILabel { 

    var onlyOnceToken: dispatch_once_t = 0 

    override func drawRect(rect: CGRect) { 

     dispatch_once(&onlyOnceToken) { 

      if let usedFont:UIFont = self.font { 

       // define your reference size here 
       let iPadHeight:CGFloat = 768 
       let screenBounds = UIScreen.mainScreen().bounds 
       let scale:CGFloat = screenBounds.height/iPadHeight 
       self.font = UIFont(name: usedFont.fontName, size: CGFloat(usedFont.pointSize) * scale) 
      } 
     } 

     super.drawRect(rect) 
    } 
} 

從現在開始,你只需要在身份檢查IB的和所有的字體會自動按比例調整到您的設備高度與MYLabel更換的UILabel類。

如果你只想與標籤尺寸長一起,與

let screenBounds = self.bounds.height 

或任何其他自定義公式規模替代

let screenBounds = UIScreen.mainScreen().bounds 

UIFont爲您提供了額外的測量屬性,您可以使用此方法進行大量測量。

14

對於那些誰到這裏來的標題和需要簡單的解決方案(後小時調查):

問題例如:如果您使用自動佈局和設置的UILabel高度成正比到屏幕高度,你會得到一個框架,iPhone(橫向)低,iPad高。如何自動調整字體高度?

解決方案:在Interface Builder,

  1. 「自動收縮」到「最小字體大小」和大小設置的東西(它影響太寬的文本,但是對於我們的解決方案所需) 。
  2. 設置「行」爲0,並使字體大小高於您將在iPad中獲得的框架。

這將導致字體都會自動提高到目前的高度。

+0

謝謝!將行設置爲0是缺少的部分,可根據需要進行縮放。我不明白爲什麼這不起作用。 – rmvz3

相關問題