我想在视图中绘制一些文字,旋转90°。我对iPhone开发很陌生,而且在网络上发布了许多不同的解决方案。我已经尝试了一些,通常最终我的文字被剪掉了。
这里发生了什么?我我在一个相当小的空间(一个表格视图单元格)中绘图,但必须有一个“正确”的方法来做到这一点......对吗?
编辑:以下是一些示例。我正试图在左边的黑条上显示“ 12345 ”文字。
首次尝试,来自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);
(来源:deeptechinc.com)
第二次尝试,来自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);
答案 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