我有一些文本,我通过NSAttributedString(下面的代码)绘制到一个固定的框架.目前我正在努力将文本大小编码为16.我的问题是,有没有办法计算给定帧文本的最佳拟合大小?
- (void)drawText:(CGContextRef)contextP startX:(float)x startY:(float)
y withText:(NSString *)standString
{
CGContextTranslateCTM(contextP, 0, (bottom-top)*2);
CGContextScaleCTM(contextP, 1.0, -1.0);
CGRect frameText = CGRectMake(1, 0, (right-left)*2, (bottom-top)*2);
NSMutableAttributedString * attrString = [[NSMutableAttributedString alloc] initWithString:standString];
[attrString addAttribute:NSFontAttributeName
value:[UIFont fontWithName:@"Helvetica-Bold" size:16.0]
range:NSMakeRange(0, attrString.length)];
CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((__bridge CFAttributedStringRef)(attrString));
struct CGPath * p = CGPathCreateMutable();
CGPathAddRect(p, NULL, frameText);
CTFrameRef frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0,0), p, NULL);
CTFrameDraw(frame, contextP);
}
Run Code Online (Sandbox Code Playgroud) 在我提出问题之前,这是来自Apple的文档:如何使用Quartz确定字符串的宽度:
如果文本测量对您的应用程序很重要,则可以使用Quartz 2D函数计算它们.但是,您可能首先考虑使用ATSUI,其优势在于文本布局和测量.ATSUI有几个获取文本度量的函数.您不仅可以获得布局后文本指标,而且在极少数情况下需要它们,您可以获得布局前文本指标.与Quartz不同,您必须自己执行计算,ATSUI会为您计算测量值.例如,您可以通过调用ATSUI函数ATSUMeasureTextImage来获取文本的图像边界矩形.
如果您决定Quartz文本比ATSUI(或Cocoa)更适合您的需求,您可以按照以下步骤在Quartz绘制之前测量文本的宽度:
- 调用函数CGContextGetTextPosition以获取当前文本位置.
- 使用函数CGContextSetTextDrawingMode将文本绘制模式设置为kCGTextInvisible.
- 通过调用函数CGContextShowText绘制文本以在当前文本位置绘制文本.
- 通过调用函数CGContextGetTextPosition确定最终文本位置.
- 从结束位置减去起始位置以确定文本的宽度.
这是我的问题:
这真的是使用Core Graphics确定字符串宽度的最佳方法吗?它似乎很脆弱,因为我的文本与2D图形元素共存,我想对所有渲染使用相同的上下文.我希望有一些紧凑的方法,如:
CGContextGetTextWidthAndHeight(context, text);
Run Code Online (Sandbox Code Playgroud)我读到ATSUI已经过时,将被Core Text取代.这是真的,如果是这样,是在iOS吗?
在iOS7中,不推荐使用CGContextSelectFont.弃用消息说我必须使用Core Text,但我不知道这段代码的确切等价物:
CGContextSelectFont(context, "Helvetica", kBarLabelSize, kCGEncodingMacRoman);
CGContextSetTextDrawingMode(context, kCGTextFill);
CGContextSetRGBFillColor(context, 0, 0, 0, 1.0);
CGContextSetTextMatrix (context, CGAffineTransformMake(1.0, 0.0, 0.0, -1.0, 0.0, 0.0));
CGContextShowTextAtPoint(context, barX, barY, [@"Some text" cStringUsingEncoding:NSUTF8StringEncoding], [barValue length]);
Run Code Online (Sandbox Code Playgroud)
我已经能够使用以下代码创建字体:
CFMutableAttributedStringRef attrStr = CFAttributedStringCreateMutable(kCFAllocatorDefault, 0);
CTFontRef font = CTFontCreateWithName(CFSTR("Helvetica"), kBarLabelSize, NULL);
CFAttributedStringSetAttribute(attrStr, CFRangeMake(0, CFAttributedStringGetLength(attrStr)), kCTFontAttributeName, font);
Run Code Online (Sandbox Code Playgroud)
但是现在我可以用这种字体"绘制"文本到上下文中吗?
我想在仅UILabel
使用该attributedText
NSAttributedString
属性的情况下执行首字下沉.像这样:
http://www.interpretationbydesign.com/wp-content/uploads/2009/02/drop_caps.gif
我已经尝试将第一个字符范围的基线调整为负值,它可以将第一个字符的顶部与第一个字符的其余部分的顶部对齐.但我还没有找到任何方法让其他线条流向掉落角色的右侧.
这可以使用NSAttributedString only
,或者我必须拆分字符串并使用Core Text自己渲染吗?
关于OpenGL字体渲染有很多问题,其中许多问题都是由纹理图集(快速但错误)或字符串纹理(仅限固定文本)所满足.
然而,这些方法很差,似乎已经过时了(使用着色器更好/更快地做到这一点怎么样?).对于OpenGL 4.1,有一个很好的问题,看看"你今天应该使用什么?":
那么,今天我们应该在iOS GL ES 2上使用什么?
我很失望,似乎没有开源(甚至是商业解决方案).我知道有很多团队把它搞砸了,花了几周的时间重新发明这个轮子,逐渐学习如何克服和空间等(呃) - 但必须有一个比重写整个"字体"更好的方法从头开始?
据我所知,这有两个部分:
对于1(如何渲染),Apple提供了许多方法来获得"正确的"渲染输出 - 但"简单"的方法不支持OpenGL(也许其他一些方式 - 例如是否有一种简单的方法来映射CoreText输出到OpenGL?).
对于2(如何显示),我们有着色器,我们有VBO,我们有字形纹理,我们有查找纹理,以及其他tecniques(例如上面链接的OpenGL 4.1内容?)
以下是我所知道的两种常见的OpenGL方法:
我也看过,但听到了好的和坏的事情:
在Apple自己的OS /标准库中,我知道几种文本呈现源.注意:我已经在2D渲染项目中详细使用了大部分这些,我关于它们输出不同渲染的陈述是基于直接经验
我想像下面的样式一样绘制文本 - 图像总是在右上角,文本在图像周围.
谁能告诉我如何在iOS上实现这一点?我需要使用核心文本吗?
提前致谢!
当我在原始iPad上运行Core Text时,我看到了一些性能问题.
我使用Core Text和UITextInput
基于OmniGroup的协议创建了一个可编辑的视图OUIEditableFrame
.
当视图中有相当数量的文本说180行时,键入/输入大大滞后,一键敲击通常需要1-2秒.
使用仪器和模拟器我能够缩小问题的范围并找出花费了大量时间的东西.事实证明这是因为我用每个击键重绘帧,花费这么多时间的是调用CTFramesetterCreateWithAttributedString
和CTFramesetterCreateFrame
.
我必须重写每个按键,以便文本更新,这意味着调用CTFramesetterCreateWithAttributedString
和CTFramesetterCreateFrame
.
有没有其他人遇到这个问题,如果有的话,他们是如何解决这个问题的呢?
编辑:
进行了一些进一步的调查,结果表明如果属性字符串没有属性,那么所有内容都会更快地绘制并且没有任何延迟.更改字体,颜色或段落样式都会降低速度.不知道这可能与它有关吗?
我正在开发一个Reader项目,目前我正在解析XML文件并转换为属性字符串,我在CoreText中渲染它(使用的Apple 示例代码).
XML文件大小超过6 MB.文本正确呈现,但我无法呈现图像和表格(如html表格).
同时我需要管理性能.我也尝试了UITextView
,但它只显示了四分之一的文本,之后文本消失了.
有没有其他技术来渲染文本,图像和表格?
PS - 客户不想要UIWebView
.
有没有一种简单的方法来获取(或简单地显示)UILabel中给定行的文本?
我的UILabel正确地显示我的文本并将其精美地展示出来,但偶尔我需要能够显示某些行,但显然我需要知道UILabel如何定位所有这些.
我知道这可以通过子字符串轻松完成,但我需要知道该行的起点和终点.
或者,如果UILabel的框架有某种偏移并且隐藏了我不想看到的其他内容,我可以滚动UILabel.
我无法发现任何显示如何轻松完成此操作的内容.有人有什么好主意吗?
谢谢
iphaaw
我有一个UITextView
,当用户输入文本时,我想动态格式化文本.语法高亮......
为此,我想用UITextView
...
一切正常,期待一个问题:我从文本视图中获取文本并从中NSAttributedString
获取.我对这个属性字符串进行了一些编辑,并将其设置为textView.attributedText
.
每次用户输入时都会发生这种情况.所以我必须记住selectedTextRange
编辑之前的attributedText
事情,然后将其设置回来,以便用户可以继续在他之前输入的地方打字.唯一的问题是,一旦文本足够长就需要滚动,UITextView
如果我慢慢输入,现在将开始滚动到顶部.
以下是一些示例代码:
- (void)formatTextInTextView:(UITextView *)textView
{
NSRange selectedRange = textView.selectedRange;
NSString *text = textView.text;
// This will give me an attributedString with the base text-style
NSMutableAttributedString *attributedString = [self attributedStringFromString:text];
NSError *error = nil;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"#(\\w+)" options:0 error:&error];
NSArray *matches = [regex matchesInString:text
options:0
range:NSMakeRange(0, text.length)];
for (NSTextCheckingResult *match in matches)
{
NSRange matchRange = [match rangeAtIndex:0];
[attributedString addAttribute:NSForegroundColorAttributeName
value:[UIColor …
Run Code Online (Sandbox Code Playgroud) core-text ×10
ios ×9
objective-c ×6
fonts ×2
uilabel ×2
uitextview ×2
ios7 ×1
ipad ×1
iphone ×1
nsstring ×1
opengl-es ×1
swift ×1
typography ×1
uitableview ×1