2011-12-19 85 views
3

我有一段代碼每次發生後端數據庫更改時都會執行。基本上我有一個父視圖內的標籤。標籤通過許多狀態消息之一進行更新,每條消息在不同的行上由新行(\ n)結尾。每條狀態消息只需要在一條線上,而不能超過。sizeToFit運行奇怪

我遇到的問題是,View首次重新加載時,一切正常。但是,當我在屏幕上並且在後臺發生更改時,偶爾會有多行顯示狀態消息。雖然sizeToFit將標籤製作得和父視圖一樣高,但它在寬度方面做得很差。這就是說它會在多行上分解文本,而不是僅僅查看換行符。

我該怎麼辦?

self.messageLabel.text = message; //lets get the status message. 
     [self.messageLabel sizeToFit]; 
     [self.messageLabel setNeedsDisplay]; 
     CGRect frame = [self.messageView frame]; 
     frame.size.height = self.messageLabel.bounds.size.height; 
     self.messageView.frame = frame; 
     self.messageLabel.center = CGPointMake(CGRectGetMidX(self.messageView.bounds), CGRectGetMidY(self.messageView.bounds)-(self.messageView.cornerRadius/4)); 
     self.messageLabel.backgroundColor = [UIColor orangeColor]; 
     [self.messageView setNeedsDisplay]; 

回答

1

爲了確定您的標籤需要的大小,您需要查看NSString大小的方法。有一些可以告訴你的字符串將被賦予一個字體的大小,以及各種約束。

例如,[@"string" sizeWithFont: forWidth: lineBreakMode:];將返回CGSize,然後您可以使用它來適當調整標籤的大小。

另外,我發現UILabel不能很好地處理多行的字符串。你可能最好寫自己的UIView子視圖,它可以處理多行文本,每行都有自己的標籤。

1

每次在初始操作後調整幀大小時都會發生這種情況。在確定-sizeToFit的新尺寸時,可能會使用該框架的當前尺寸。 我使用的解決方法是在每次調用sizeToFit之前將視圖的幀設置爲預定義的大小,例如:

myLabel.frame = CGRectMake(0, 0, self.frame.size.width, self.frame.width.height); 
[myLabel sizeToFit];