在下面的代码中,CTFramesetterSuggestFrameSizeWithConstraints有时返回一个CGSize高度不足以包含传递给它的所有文本的高度.我确实看过这个答案.但在我的情况下,文本框的宽度需要是恒定的.有没有其他/更好的方法来确定我的属性字符串的正确高度?谢谢!
CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString(attributedString);
CGSize tmpSize = CTFramesetterSuggestFrameSizeWithConstraints(framesetter, CFRangeMake(0,0), NULL, CGSizeMake(self.view.bounds.size.width, CGFLOAT_MAX), NULL);
CGSize textBoxSize = CGSizeMake((int)tmpSize.width + 1, (int)tmpSize.height + 1);
Run Code Online (Sandbox Code Playgroud) 在iOS中呈现快速更改文本(10-15个数字可以改变每一帧)的最高效的方法是什么?这些是我到目前为止所做的尝试:
1)CATextLayer+ CTFont和NSString:相当快,但无法访问我需要的字距调整.(如果有人知道如何使用CTFont和不使用kerning的技巧NSAttributedString,这也很酷,但这不是主要问题;))
2)CATextLayer+ NSAttributedString:缓慢且滞后.与1)相比,我看到了巨大的FPS下降.在我的应用程序中,此更改使FPS从50-60降至30.
3)位图字体,使用UIImageViews和UIImage显示数字:虽然不是很令人满意,但是在iOS中应该有更好的方式/更自然的方式来有效地渲染字体.
编辑:
4)UILabel+ NSString- 相当快,但再次无法访问字距.
5)UILabel+ NSAttributedString- 再次缓慢而迟缓.
渲染NSAttributedStringa比渲染基本要慢得多NSString.这真是令人沮丧,因为我现在需要NSAttributedString的只是字母之间的间距.
我正在使用a NSMutableAttribtuedString来构建带有格式的字符串,然后我将其传递给Core Text以渲染到框架中.问题是,我需要使用上标和下标.除非这些字符在字体中可用(大多数字体不支持它),否则设置属性kCTSuperscriptAttributeName什么都不做.
所以我想我只留下了唯一的选择,即通过改变字体大小和移动基线来伪造它.我可以做字体大小位,但不知道改变基线的代码.有人可以帮忙吗?
谢谢!
编辑:我正在考虑,考虑到我可以用来解决这个问题的时间,编辑一个字体,以便给它一个下标"2"......或者找到一个内置的iPad字体.有没有人知道任何带有下标"2"的衬线字体我可以使用?
我正试图在iPad中设置一个CTFrame与我UITextView的文本格式完全匹配的文件.首先,我将UITextView文本转换为属性字符串.然后我设置了绘图框的宽度和高度,其中Core Text将绘制文本.我成功地使用Core Text绘制文本,但UITextViewCore Text显示略有不同的结果,即使我使用相同的字体和大小.具体来说,当我使用时[UIFont systemFontOfSize:21],每个空格中的UITextView像素比Core Text的结果多一个像素.
对于短句或单词是可以的,但如果UITextView和Core Text有多行,则它们的结果会变得非常不同.例如,UITextView对行尾的一个单词执行自动换行,而Core Text将该单词保留在同一行.如果你看到附图,最后一个单词"段落"的起始位置已经非常不同了(由于8个空格字符,8个像素的间隙).
更糟糕的是,如果我使用不同的字体,例如添加到我的项目中的自定义字体,则每个字符都会UITextView有1个像素.
我正在使用Core Text来查找当前光标的像素位置UITextView,因此它们彼此完全匹配,每行包含相同数量的字符和单词.
问题:有没有办法使Core Text对象与UITextView的文本格式完全匹配?
谢谢!
这是我如何设置属性字符串的代码.(我刚刚关注了Core Text Guide.)
CTFontRef font = CTFontCreateWithName((CFStringRef) [UIFont systemFontOfSize:21.0].fontName, 21.0, NULL);
CFMutableAttributedStringRef attrString2 = CFAttributedStringCreateMutable(kCFAllocatorDefault, 0);
CFAttributedStringReplaceString (attrString2, CFRangeMake(0, 0), (CFStringRef) string);
CFAttributedStringSetAttribute(attrString2, CFRangeMake(0, [string length]),kCTFontAttributeName, font);
Run Code Online (Sandbox Code Playgroud)
这是一张照片.

嗨我试图在标签矩形与UIView相交的情况下改变UILabel的文本颜色,我想也许有一个属性或我可以使用的东西.如下图所示:

有人之前遇到过这个问题,或者我应该阅读什么才能开始做这件事?
提前致谢
我需要获取有关我的属性字符串的信息,但无法弄清楚如何.我收到这本词典:
2013-11-04 18:06:10.628 App[1895:60b] {
NSColor = "UIDeviceWhiteColorSpace 0.3 1";
NSFont = "<UICTFont: 0x17d8d4c0> font-family: \".HelveticaNeueInterface-MediumP4\"; font-weight: bold; font-style: normal; font-size: 17.00pt";
NSUnderline = 0;
}
Run Code Online (Sandbox Code Playgroud)
通过以下方式检查下划线很容易:
[attrs objectForKey:@"NSUnderline"]
Run Code Online (Sandbox Code Playgroud)
但是如何获取有关字体的信息,如字体样式,字体重量等.
谢谢你的帮助
这是Twitter应用程序的屏幕截图供参考:http://screencast.com/t/YmFmYmI4M
我想要做的是在NSAttributedString中的子字符串顶部放置一个浮动弹出窗口,该字符串可以跨越多行.NSAttributedString是项目的要求.
在提供的屏幕截图中,您可以看到链接是背景突出显示的,因此它让我相信他们正在使用CoreText和NSAttributedStrings.我还找到了一个名为CTRunRef(http://developer.apple.com/library/ios/#documentation/Carbon/Reference/CTRunRef/Reference/reference.html)的东西看起来很有前景,但我很难将它们整合在一起概念.
简而言之,如果我在核心文本中有一个段落,当我点击一个单词时,如何找到该单词的边界框?
从理论上讲,这些应该是相同的大小,但它们不是:

蓝色文本来自Core Text,黑色来自-[NSString drawInRect:].这是代码:
//Some formatting to get the correct frame
int y = MESSAGE_FRAME.origin.y + 8;
if (month) y = y + 27;
int height = [JHomeViewCellContentView heightOfMessage:self.entry.message];
CGRect rect = CGRectMake(MESSAGE_FRAME.origin.x + 8, y, MESSAGE_FRAME.size.width - 16, height);
//Draw in rect method
UIFont *font = [UIFont fontWithName:@"Crimson" size:15.0f];
[[UIColor colorWithWhite:0.2 alpha:1.0] setFill];
[self.entry.message drawInRect:rect withFont:font lineBreakMode:UILineBreakModeWordWrap alignment:UITextAlignmentLeft];
//Frame change to suit CoreText
CGRect rect2 = CGRectMake(MESSAGE_FRAME.origin.x + 8, self.bounds.size.height - y - height, MESSAGE_FRAME.size.width - 16, …Run Code Online (Sandbox Code Playgroud) 我的应用程序中有一个秒表功能,使用居中UILabel的比例间距字体来渲染时间.每次增加标签的宽度都会发生变化,从而产生一种在快速速度下看起来特别糟糕的弹跳效果.这是一个例子.
我怎样才能解决这个问题?
iOS 9更新
它现在是一个单行:
UIFont.monospacedDigitSystemFontOfSize(17, weight: UIFontWeightRegular)
Run Code Online (Sandbox Code Playgroud)
此外,我上次尝试时,下面的解决方案不适用于iOS 9.浪费了相当多的时间调试之前在标题中遇到这个问题.
解
在iOS 7中使用Text Kit变得微不足道.
确保导入Core Text:
#import <CoreText/CoreText.h>
Run Code Online (Sandbox Code Playgroud)
创建一个将比例数转换为等宽数字的设置:
NSArray *monospacedSetting = @[@{UIFontFeatureTypeIdentifierKey: @(kNumberSpacingType),
UIFontFeatureSelectorIdentifierKey: @(kMonospacedNumbersSelector)}];
Run Code Online (Sandbox Code Playgroud)
通过附加当前使用的字体描述符来创建新的字体描述符UILabel:
UIFontDescriptor *newDescriptor = [[timeLabel.font fontDescriptor] fontDescriptorByAddingAttributes:@{UIFontDescriptorFeatureSettingsAttribute: monospacedSetting}];
Run Code Online (Sandbox Code Playgroud)
更新标签的字体:
// Size 0 to use previously set font size
timeLabel.font = [UIFont fontWithDescriptor:newDescriptor size:0];
Run Code Online (Sandbox Code Playgroud) 我正在尝试将一些代码移植到使用UIFont和的Swift CTFont,并且(成功地,在Objective-C中)使用简单的桥接转换来从一个转换到另一个,反之亦然.
例如,考虑此代码(在UIFontDescriptor类别中):
UIFont *font = [UIFont fontWithDescriptor:self size:0.0];
NSArray *features = CFBridgingRelease(CTFontCopyFeatures((__bridge CTFontRef)font));
Run Code Online (Sandbox Code Playgroud)
我还没有弄清楚如何以一种实际编译的方式在Swift中表达这一点.以下至少不会:
let font = UIFont(descriptor:self, size: 0.0)
let features = CTFontCopyFeatures(font as CTFont)
Run Code Online (Sandbox Code Playgroud)
错误:'UIFont'无法转换为'CTFont'
core-text ×10
ios ×5
objective-c ×5
iphone ×4
ipad ×3
swift ×2
ios4 ×1
nsstring ×1
performance ×1
subscript ×1
substring ×1
uikit ×1
uitextview ×1
xcode ×1