我正在使用一个实例UIWebView
来处理一些文本并正确地着色它,它将结果作为HTML而不是显示在UIWebView
我希望Core Text
用a 显示它NSAttributedString
.
我能够创建和绘制NSAttributedString
但我不确定如何将HTML转换并将HTML映射到属性字符串.
据我所知,在Mac OS X下NSAttributedString
有一个initWithHTML:
方法,但这只是Mac的补充,不适用于iOS.
我也知道有一个类似的问题,但它没有答案,我虽然我会再试一次,看看是否有人创造了一种方法来做到这一点,如果是的话,他们是否可以分享它.
如何将文本对齐属性添加到NSAttributedString以使文本居中?
编辑:我做错了什么?它似乎没有改变对齐方式.
CTParagraphStyleSetting setting;
setting.spec = kCTParagraphStyleSpecifierAlignment;
setting.valueSize = kCTCenterTextAlignment;
CTParagraphStyleSetting settings[1] = {
{kCTParagraphStyleSpecifierAlignment, sizeof(CGFloat), &setting},
};
CTParagraphStyleRef paragraph = CTParagraphStyleCreate(settings, sizeof(setting));
NSMutableAttributedString *mutableAttributed = [[NSMutableAttributedString alloc] initWithAttributedString:self.attributedString];
[mutableAttributed addAttributes:[NSDictionary dictionaryWithObjectsAndKeys:(NSObject*)paragraph ,(NSString*) kCTParagraphStyleAttributeName, nil] range:_selectedRange];
Run Code Online (Sandbox Code Playgroud) 我完全沉浸在Core Text的行距中.我正在使用NSAttributedString并在其上指定以下属性: - kCTFontAttributeName - kCTParagraphStyleAttributeName
从这里创建CTFrameSetter并将其绘制到上下文中.
在段落样式属性中,我想指定行的高度.
当我使用kCTParagraphStyleSpecifierLineHeightMultiple时,每一行都会在文本顶部接收填充,而不是在此高度的中间显示文本.
当我使用kCTParagraphStyleSpecifierLineSpacing时,填充将添加到文本的底部.
请帮助我达到指定的行高,文本(字形)位于该高度的中间,而不是位于行的底部或顶部的文本.
如果没有明确创建CTLine的路线等,这是不可能的?
我需要为NSAttributedString(Core Text)中的每个字符(字形)计算精确的边界框.在整理了一些用于解决类似问题的代码(核心文本选择等)之后,结果非常好,但只有少数帧(红色)正在被正确计算:
大多数帧都是水平或垂直错位(微小位).这是什么原因?我怎样才能完善这段代码?:
-(void)recalculate{
// get characters from NSString
NSUInteger len = [_attributedString.string length];
UniChar *characters = (UniChar *)malloc(sizeof(UniChar)*len);
CFStringGetCharacters((__bridge CFStringRef)_attributedString.string, CFRangeMake(0, [_attributedString.string length]), characters);
// allocate glyphs and bounding box arrays for holding the result
// assuming that each character is only one glyph, which is wrong
CGGlyph *glyphs = (CGGlyph *)malloc(sizeof(CGGlyph)*len);
CTFontGetGlyphsForCharacters(_font, characters, glyphs, len);
// get bounding boxes for glyphs
CTFontGetBoundingRectsForGlyphs(_font, kCTFontDefaultOrientation, glyphs, _characterFrames, len);
free(characters); free(glyphs);
// Measure how mush specec will be needed for this …
Run Code Online (Sandbox Code Playgroud) 我想在一个文本块中标注所有®字符的实例(法律免责声明,当然;))并且默认方式NSAttributedString
不是很好.
如果我只是让角色成为并且仅使用未经修改的角色NSString
,则其呈现与大写字母相同的大小并且大致位于基线处.如果我将superscript属性添加到NSAttributedString
如下:
[attrStr setAttributes:@{(NSString *)kCTSuperscriptAttributeName : @1} range:NSMakeRange(locationOfReg, 1)];
Run Code Online (Sandbox Code Playgroud)
角色从基线抬起,其大小不变,但线间距现在受到影响,因为凸起的角色会侵入上面的线.
为了显示:
我在Photoshop中创建了这个图像,通过减小角色的大小和移动基线来实现所需的位置.我知道如何更改iOS中的字体大小,但更改基线似乎更棘手.有关如何实现这一目标的任何建议?
编辑:我想我可以使用上标属性作为一种方法来改变基线.现在,找出一种获取当前字体大小并随后减少它以允许在不同大小的文本块上使用相同方法的方法会很棒.
我正在尝试使用Core Text函数绘制文本,其行间距尽可能接近使用NSTextView时的行间距.
以此字体为例:
NSFont *font = [NSFont fontWithName:@"Times New Roman" size:96.0];
Run Code Online (Sandbox Code Playgroud)
如果我在NSTextView中使用它,这个字体的行高是111.0.
NSLayoutManager *lm = [[NSLayoutManager alloc] init];
NSLog(@"%f", [lm defaultLineHeightForFont:font]); // this is 111.0
Run Code Online (Sandbox Code Playgroud)
现在,如果我使用Core Text做同样的事情,结果是110.4(假设您可以通过添加上升,下降和前导来计算线高).
CTFontRef cFont = CTFontCreateWithName(CFSTR("Times New Roman"), 96.0, NULL);
NSLog(@"%f", CTFontGetDescent(cFont) + CTFontGetAscent(cFont) +
CTFontGetLeading(cFont)); // this is 110.390625
Run Code Online (Sandbox Code Playgroud)
这非常接近111.0,但对于某些字体,差异要大得多.例如,对于Helvetica,NSLayoutManager给出115.0而CTFont上升+下降+领先= 96.0.很明显,对于Helvetica,我无法使用上升+下降+导致计算线之间的间距.
所以我想我会使用CTFrame和CTFramesetter来布局几行并从中获取行间距.但这也给出了不同的价值观.
CTFontRef cFont = CTFontCreateWithName(CFSTR("Times New Roman"), 96.0, NULL);
NSDictionary *attrs = [NSDictionary dictionaryWithObject:(id)cFont forKey:(id)kCTFontAttributeName];
NSAttributedString *threeLines = [[NSAttributedString alloc] initWithString:@"abcdefg\nabcdefg\nabcdefg" attributes:attrs];
CTFramesetterRef threeLineFramesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)threeLines);
CGMutablePathRef path = CGPathCreateMutable();
CGPathAddRect(path, NULL, CGRectMake(0.0, …
Run Code Online (Sandbox Code Playgroud) 我正试图用UILabel来解决一个毛茸茸的问题,除了一件事之外,我已经弄清楚了它的大部分内容:我正在挑战了解对于CTLine
"字符串访问" 意味着什么.
我想用的方法是CTLineGetOffsetForStringIndex
.这是该方法文档的链接.
这是我不理解的文档部分(重点是我的):
charIndex沿基线的主偏移量,如果该行不支持字符串访问,则为0.0.
当我运行这个方法时,我0.0
回来了,所以我猜这意味着该行不支持字符串访问 - 但这究竟是什么意思呢?
我试图在我的代码中找到另一个内存泄漏,我似乎无法弄清楚CG Raster Data是什么.在启用自动快照的情况下通过VM Tracker时,CG栅格数据似乎是唯一增加的部分.这些也在不增加分配的情况下稳步增加.
我不完全确定CG栅格数据是什么,也不确定如何修复它,但此时增加的占用空间最终会导致内存错误和崩溃,所以它并不好!我做自己的文本渲染(使用CoreText),所以我认为它与它有关.我也在加载图片?
下面是足迹的图像:
更新: 这个问题仍然存在,但有趣的是,我可以将它与UIFoundations中的泄漏关联到称为"NSConcreteGlyphGenerator"的东西.它似乎只发生在我实际绘制的CoreText方法中的属性字符串上调用"boundingRectWithSize:"方法时.该行具体是:
[displayString boundingRectWithSize:CGSizeMake( self.frame.size.width, self.frame.size.height ) options:0 context:nil];
Run Code Online (Sandbox Code Playgroud)
慢慢跟踪它......
我需要一个带有多行属性文本的UILabel subcass,支持链接,粗体样式等.我还需要带有省略号的尾部截断.支持内部UILabels属性文本开放源代码的无(TTTAttributedLabel
,OHAttributedLabel
,TTStyledTextLabel
)似乎支持为多行文本尾截断.有一个简单的方法来获得这个吗?
在更新我的应用程序时,我注意到在 IOS13 上的 Xcode 11.2 中运行应用程序时,我在日志中收到了大量警告。
CoreText 注意:客户端请求名称“.SFUI-Regular”,它将获得 TimesNewRomanPSMT 而不是预期的字体。所有系统 UI 字体访问都应该通过适当的 API,例如 CTFontCreateUIFontForLanguage() 或 +[UIFont systemFontOfSize:]。
我仔细研究了一下,从 WWDC 中找到了这句话:
正如在许多 WWDC 会议中提到的,不直接使用点前缀字体名称。
我自己几乎只使用 IB 和笔尖来设置文本字段等的字体,并且在我的代码中的任何地方都没有提到“SFUI-Regular”,所以我不确定如何找到这些警告的实际原因(我有日志中大约有 20-30 行)。
有没有人对我如何找到警告来自哪里以及如何解决它有任何提示?
core-text ×10
ios ×7
objective-c ×6
iphone ×2
cocoa-touch ×1
ctlineref ×1
glyph ×1
instruments ×1
ipad ×1
line-spacing ×1
macos ×1
memory-leaks ×1
nstextview ×1
swift ×1
uilabel ×1
xcode ×1