2011-12-19 69 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];