当边界发生变化时,如何获得显示文本以表现为UILabel的UIView?

时间:2010-10-16 16:26:43

标签: iphone uiview uilabel

我有一个UIView,我需要在drawRect中绘制文本:

- (void)drawRect:(CGRect)rect {
    ...
    [@"some text" drawAtPoint:somePoint withFont:someFont];
    ...
}

因为文本需要特殊格式,所以我不能只使用UILabel。

在我旋转设备之前它看起来很好。然后我的自定义UIView的大小发生了变化(在父视图的layoutSubviews方法中),文本在一个方向上被拉伸而在另一个方向上被压缩。

当我用UILabel替换视图时,即使视图的边界发生变化,文本也总是很好看。

如何让我的观点表现出与UILabel相同的行为?

我已经研究了一些事情,但尚未取得成功:

  • 将视图图层的needsDisplayOnBoundsChange设置为YES。
  • 将视图的contentStretch设置为CGRectZero。
  • 在我视图的layoutSubviews中调用setNeedsDisplay。

也许我没有正确地做这些事情。还有其他人遇到过这个吗?

更新:正如James Huddleston的回答中所建议的,我将视图的contentMode属性设置为UIViewContentModeRedraw,这让我在那里的一部分。现在,动画结束时文本显示正确。但是,在动画开始时,文本会被压缩/拉伸以适应最终尺寸,然后在动画过程中得到不合格/未拉伸。 UILabel不是这种情况。

4 个答案:

答案 0 :(得分:5)

尝试将视图的contentMode属性设置为UIViewContentModeRedraw

答案 1 :(得分:2)

这似乎工作正常:

self.contentMode = UIViewContentModeRedraw;
self.contentStretch = CGRectMake(1, 1, 0.5, 0.5);

然后确保右下角的像素是背景颜色。为此,我在视图的内容周围放置了一个填充像素。似乎UILabel没有一个像素边界限制,所以它必须做一些不同的事情。但据我所知,这具有同样的效果。

答案 2 :(得分:1)

Kevin Ballard创建了一些名为FontLabel的源代码。 (code.google.com

关于这个的好处,它是UILabel的子类,你可以使用自己的Font;)

//编辑:好的,告诉我将更新我的答案以推荐子类化UILabel "to get all the UILabel goodness" ^^

答案 3 :(得分:1)

使用UIWebView

听起来有点矫枉过正,但似乎推荐的方式来获得比UILabel更复杂的格式化文本。