标签: core-text

计算字体大小以适合框架 - 核心文本 - NSAttributedString - iOS

我有一些文本,我通过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)

fonts objective-c nsattributedstring core-text ios

20
推荐指数
5
解决办法
2万
查看次数

iOS:如何使用Quartz测量字符串的宽度和高度?

在我提出问题之前,这是来自Apple的文档:如何使用Quartz确定字符串的宽度:

如果文本测量对您的应用程序很重要,则可以使用Quartz 2D函数计算它们.但是,您可能首先考虑使用ATSUI,其优势在于文本布局和测量.ATSUI有几个获取文本度量的函数.您不仅可以获得布局后文本指标,而且在极少数情况下需要它们,您可以获得布局前文本指标.与Quartz不同,您必须自己执行计算,ATSUI会为您计算测量值.例如,您可以通过调用ATSUI函数ATSUMeasureTextImage来获取文本的图像边界矩形.

如果您决定Quartz文本比ATSUI(或Cocoa)更适合您的需求,您可以按照以下步骤在Quartz绘制之前测量文本的宽度:

  1. 调用函数CGContextGetTextPosition以获取当前文本位置.
  2. 使用函数CGContextSetTextDrawingMode将文本绘制模式设置为kCGTextInvisible.
  3. 通过调用函数CGContextShowText绘制文本以在当前文本位置绘制文本.
  4. 通过调用函数CGContextGetTextPosition确定最终文本位置.
  5. 从结束位置减去起始位置以确定文本的宽度.

这是我的问题:

  1. 这真的是使用Core Graphics确定字符串宽度的最佳方法吗?它似乎很脆弱,因为我的文本与2D图形元素共存,我想对所有渲染使用相同的上下文.我希望有一些紧凑的方法,如:

    CGContextGetTextWidthAndHeight(context, text);
    
    Run Code Online (Sandbox Code Playgroud)
  2. 我读到ATSUI已经过时,将被Core Text取代.这是真的,如果是这样,是在iOS吗?

objective-c quartz-graphics core-text ios

19
推荐指数
1
解决办法
2万
查看次数

CGContextSelectFont等价

在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)

但是现在我可以用这种字体"绘制"文本到上下文中吗?

iphone objective-c core-text ios7

19
推荐指数
2
解决办法
1万
查看次数

使用NSAttributedString删除上限

我想在仅UILabel使用该attributedText NSAttributedString属性的情况下执行首字下沉.像这样:

http://www.interpretationbydesign.com/wp-content/uploads/2009/02/drop_caps.gif

我已经尝试将第一个字符范围的基线调整为负值,它可以将第一个字符的顶部与第一个字符的其余部分的顶部对齐.但我还没有找到任何方法让其他线条流向掉落角色的右侧.

这可以使用NSAttributedString only,或者我必须拆分字符串并使用Core Text自己渲染吗?

typography nsattributedstring uilabel core-text ios

18
推荐指数
3
解决办法
2880
查看次数

OpenGLES 2中的文本/字体渲染(iOS - CoreText?) - 选项和最佳实践?

关于OpenGL字体渲染有很多问题,其中许多问题都是由纹理图集(快速但错误)或字符串纹理(仅限固定文本)所满足.

然而,这些方法很差,似乎已经过时了(使用着色器更好/更快地做到这一点怎么样?).对于OpenGL 4.1,有一个很好的问题,看看"你今天应该使用什么?":

从版本4.1开始,OpenGL中的文本渲染技术是什么?

那么,今天我们应该在iOS GL ES 2上使用什么?

我很失望,似乎没有开源(甚至是商业解决方案).我知道有很多团队把它搞砸了,花了几周的时间重新发明这个轮子,逐渐学习如何克服和空间等(呃) - 但必须有一个比重写整个"字体"更好的方法从头开始?


据我所知,这有两个部分:

  1. 我们如何使用字体渲染文字?
  2. 我们如何显示输出?

对于1(如何渲染),Apple提供了许多方法来获得"正确的"渲染输出 - 但"简单"的方法不支持OpenGL(也许其他一些方式 - 例如是否有一种简单的方法来映射CoreText输出到OpenGL?).

对于2(如何显示),我们有着色器,我们有VBO,我们有字形纹理,我们有查找纹理,以及其他tecniques(例如上面链接的OpenGL 4.1内容?)

以下是我所知道的两种常见的OpenGL方法:

  1. 纹理图集(渲染所有字形一次,然后从共享纹理渲染每个字符1 x纹理四边形)
    1. 这是错误的,除非你使用20世纪80年代的"位图字体"(即便如此:纹理图集需要比看似更多的工作,如果你需要它更正确的非平凡字体)
    2. (字体不是"字形的集合",有大量的定位,布局,包装,间距,字距,样式,着色,加权等.纹理图集失败)
  2. 固定字符串(使用任何Apple类正确渲染,然后截取背景图像数据,并上传为纹理)
    1. 从人的角度来说,这很快.在帧渲染中,这非常非常慢.如果您使用大量更改文本执行此操作,则帧速率会在整个范围内显示
    2. 从技术上讲,它大多是正确的(不完全是:你以这种方式丢失了一些信息)但效率极低

我也看过,但听到了好的和坏的事情:

  1. Imagination/PowerVR"Print3D"(链接坏了)(来自制造GPU的人!但是他们的网站移动/删除了文本渲染页面)
  2. FreeType(需要预处理,解释,大量代码,额外的库?)
  3. ...和/或FTGL http://sourceforge.net/projects/ftgl/(谣言:慢?错误?很长时间没有更新?)
  4. 字体存储http://digestingduck.blogspot.co.uk/2009/08/font-stash.html(高质量,但非常慢?)
  5. 1.

在Apple自己的OS /标准库中,我知道几种文本呈现源.注意:我已经在2D渲染项目中详细使用了大部分这些,我关于它们输出不同渲染的陈述是基于直接经验

  1. CoreGraphics与NSString
    1. 最简单的:渲染"进入CGRect"
    2. 似乎是人们推荐的"固定字符串"方法的稍微快一点的版本(即使你期望它大致相同)
  2. UILabel和UITextArea用纯文本
    1. NB:他们不一样!他们如何渲染smae文本略有不同
  3. NSAttributedString,呈现给上面的一个
    1. 再次:渲染方式不同(我所知道的差异相当微妙并被归类为"错误",关于此的各种SO问题)
  4. CATextLayer
    1. iOS字体和旧C渲染之间的混合体.使用"不完全"免费桥接的CFFont/UIFont,它揭示了一些更多的渲染差异/陌生感
  5. CoreText
    1. ......最终的解决方案?但是它自己的野兽......

fonts core-animation opengl-es core-text ios

18
推荐指数
1
解决办法
6876
查看次数

如何在iOS上使用文本换行绘制图像?

我想像下面的样式一样绘制文本 - 图像总是在右上角,文本在图像周围.

在此输入图像描述

谁能告诉我如何在iOS上实现这一点?我需要使用核心文本吗?

提前致谢!

objective-c uitableview nsstring core-text ios

17
推荐指数
1
解决办法
1万
查看次数

核心文字表现

当我在原始iPad上运行Core Text时,我看到了一些性能问题.

我使用Core Text和UITextInput基于OmniGroup的协议创建了一个可编辑的视图OUIEditableFrame.

当视图中有相当数量的文本说180行时,键入/输入大大滞后,一键敲击通常需要1-2秒.

使用仪器和模拟器我能够缩小问题的范围并找出花费了大量时间的东西.事实证明这是因为我用每个击键重绘帧,花费这么多时间的是调用CTFramesetterCreateWithAttributedStringCTFramesetterCreateFrame.

我必须重写每个按键,以便文本更新,这意味着调用CTFramesetterCreateWithAttributedStringCTFramesetterCreateFrame.

有没有其他人遇到这个问题,如果有的话,他们是如何解决这个问题的呢?


编辑:

进行了一些进一步的调查,结果表明如果属性字符串没有属性,那么所有内容都会更快地绘制并且没有任何延迟.更改字体,颜色或段落样式都会降低速度.不知道这可能与它有关吗?

objective-c ipad core-text ios

17
推荐指数
2
解决办法
4352
查看次数

如何在iOS中渲染大尺寸文档?

我正在开发一个Reader项目,目前我正在解析XML文件并转换为属性字符串,我在CoreText中渲染它(使用的Apple 示例代码).

XML文件大小超过6 MB.文本正确呈现,但我无法呈现图像和表格(如html表格).

同时我需要管理性能.我也尝试了UITextView,但它只显示了四分之一的文本,之后文本消失了.

有没有其他技术来渲染文本,图像和表格?

PS - 客户不想要UIWebView.

objective-c uitextview core-text ios

16
推荐指数
1
解决办法
486
查看次数

如何从UILabel的第n行获取text/String?

有没有一种简单的方法来获取(或简单地显示)UILabel中给定行的文本?

我的UILabel正确地显示我的文本并将其精美地展示出来,但偶尔我需要能够显示某些行,但显然我需要知道UILabel如何定位所有这些.

我知道这可以通过子字符串轻松完成,但我需要知道该行的起点和终点.

或者,如果UILabel的框架有某种偏移并且隐藏了我不想看到的其他内容,我可以滚动UILabel.

我无法发现任何显示如何轻松完成此操作的内容.有人有什么好主意吗?

谢谢

iphaaw

uilabel core-text ios swift

14
推荐指数
5
解决办法
1万
查看次数

用属性字符串替换UITextViews文本

我有一个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)

uitextview nsattributedstring core-text ios

14
推荐指数
1
解决办法
3万
查看次数