iPhone:绘制旋转文字?

时间:2009-11-09 21:05:56

标签: iphone text drawing rotation

我想在视图中绘制一些文字,旋转90°。我对iPhone开发很陌生,而且在网络上发布了许多不同的解决方案。我已经尝试了一些,通常最终我的文字被剪掉了。

这里发生了什么?我在一个相当小的空间(一个表格视图单元格)中绘图,但必须有一个“正确”的方法来做到这一点......对吗?


编辑:以下是一些示例。我正试图在左边的黑条上显示“ 12345 ”文字。

  1. 首次尝试,来自RJShearman on the Apple Discussions

    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSelectFont (context, "Helvetica-Bold", 16.0, kCGEncodingMacRoman);
    CGContextSetTextDrawingMode (context, kCGTextFill);
    CGContextSetRGBFillColor(context, 1.0, 0.0, 0.0, 1.0);
    CGContextSetTextMatrix (context, CGAffineTransformRotate(CGAffineTransformScale(CGAffineTransformIdentity, 1.f, -1.f ), M_PI/2));
    CGContextShowTextAtPoint (context, 21.0, 55.0, [_cell.number cStringUsingEncoding:NSUTF8StringEncoding], [_cell.number length]);
    CGContextRestoreGState(context);
    

    Attempt one. The one and part of the two are clipped out.
    (来源:deeptechinc.com

  2. 第二次尝试,来自zgombosi on iPhone Dev SDK。相同的结果(这里的字体略小,因此剪裁较少)。

    CGContextRef context = UIGraphicsGetCurrentContext();
    CGPoint point = CGPointMake(6.0, 50.0);
    CGContextSaveGState(context);
    CGContextTranslateCTM(context, point.x, point.y);
    CGAffineTransform textTransform = CGAffineTransformMakeRotation(-1.57);
    CGContextConcatCTM(context, textTransform);
    CGContextTranslateCTM(context, -point.x, -point.y);
    [[UIColor redColor] set];
    [_cell.number drawAtPoint:point withFont:[UIFont fontWithName:@"Helvetica-Bold" size:14.0]];
    CGContextRestoreGState(context);
    

    Attempt two. There is almost identical clipping http://dev.deeptechinc.com/sidney/share/iphonerotation/attempt2.png

5 个答案:

答案 0 :(得分:7)

事实证明,无论行高如何,我的表格单元总是初始化为44px高,所以我的所有绘图都从单元格的顶部剪切了44px。

要绘制较大的单元格,必须使用

设置内容视图的autoresizingMask
cellContentView.autoresizingMask = UIViewAutoresizingFlexibleHeight;

cellContentView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

...并且使用正确的大小调用drawRect。在某种程度上,这是有道理的,因为UITableViewCell的{​​{1}}没有提到单元格的大小,只有表格视图实际上知道每行的大小,基于它自己的大小及其代表对initWithStyle:reuseIdentifier:的回应。

我阅读了Quartz 2D Programming Guide,直到绘图模型和函数开始有意义,并且绘制旋转文本的代码变得简单明了:

tableView:heightForRowAtIndexPath:

感谢您提示,看起来我已经准备好了。

答案 1 :(得分:3)

使用: -

label.transform = CGAffineTransformMakeRotation(- 90.0f * M_PI / 180.0f);

其中label是UILabel的对象。

答案 2 :(得分:2)

这是一个提示。我假设你在drawRect中做这个绘图。你为什么不在drawRect周围绘制一个框架,看看矩形有多大,如果这就是你剪裁的原因。

另一种方法是将文本放在UILabel中,然后在cellForRowAtIndexPath中创建单元格时旋转90度。

答案 3 :(得分:1)

你知道UITableViewDelegate方法heightForRowAtIndexPath吗?

这是一个simple tutorial on various graphics level methods.假设您知道文本的大小,您应该能够适当地调整表格视图行大小。

另外,我会检查以确保任何转换后的界限实际符合您的期望。 (使用调试器或日志语句来验证这一点。)

答案 4 :(得分:0)

在我发现我需要将以下内容添加到文件顶部后,我喜欢Matt的方法。非常简单。

#define degreesToRadian(x) (M_PI * (x) / 180.0)
mahboudz的建议可能是你阻力最小的道路。您可以使用以下方法旋转UILabel 90deg:[label setTransform:CGAffineTransformMakeRotation(DegreesToRadians(-90.0f))];您只需根据标签宽度计算单元格高度。 -Matt - Matt Long 11月10日0:09