ios - ios 6 和 ios 5.1 之间核心文本的差异?

标签 ios ios5 ios6 core-text

从这两个屏幕截图中可以看出,ios 5.1 和 ios 6 之间的 CoreText 实现似乎存在一些差异:

iOS 6: enter image description here

iOS 5: enter image description here

首先,文本颜色应用不正确。似乎在 ios 5.1 上,kCTForegroundColorAttributeName 要求您给它一个 CGColor,而在 ios 6 上,传递一个 UIColor 就足够了。所以我通过将代码更改为:

[attributes setObject:(id)[color CGColor] 
               forKey:(NSString*)kCTForegroundColorAttributeName];

其次,段落间距有点不对。 “sight”和“According”之间的距离是 11px vs 25px(在屏幕截图中测量)。在这两种情况下,段落间距都设置为 5:

NSMutableData *styleSettingsArray = [NSMutableData data];
CGFloat spaceBefore,spaceAfter;
...
CTParagraphStyleSetting styleSettingB = {kCTParagraphStyleSpecifierParagraphSpacingBefore   ,sizeof(CGFloat),&spaceBefore};
CTParagraphStyleSetting styleSettingA = {kCTParagraphStyleSpecifierParagraphSpacing         ,sizeof(CGFloat),&spaceAfter};
[styleSettingsArray appendBytes:&styleSettingB length:sizeof(styleSettingB)];
[styleSettingsArray appendBytes:&styleSettingA length:sizeof(styleSettingA)];
...
if(styleSettingsArray.length > 0)
{
    CTParagraphStyleRef paragraphStyleRef = CTParagraphStyleCreate([styleSettingsArray bytes], [styleSettingsArray length] / sizeof(CTParagraphStyleSetting));
    [dictionary setObject:(__bridge id)(paragraphStyleRef) forKey:(NSString*)kCTParagraphStyleAttributeName];
    CFRelease(paragraphStyleRef);
}

控制台中paragraphStyleRef的说明:

iOS 6:
CTParagraphStyle:
base writing direction = -1, alignment = 3, line break mode = 0, default tab interval = 0
first line head indent = 0, head indent = 0, tail indent = 0
line height multiple = 0, maximum line height = 0, minimum line height = 0
line spacing adjustment = 0, paragraph spacing = 5, paragraph spacing before = 5


iOS 5:

CTParagraphStyle:
writing direction = -1, alignment = 3, line break mode = 0, default tab interval = 0
first line head indent = 0, head indent = 0, tail indent = 0
line height multiple = 0, maximum line height = 0, minimum line height = 0
line spacing adjustment = 0, paragraph spacing = 5, paragraph spacing before = 5

这对我来说似乎是一样的,所以我不知道是什么问题。除了段落之间的间距外,它们是相同的。

那么我该如何解决这个问题呢?还有其他我应该注意的事情可能会导致文本显示不同吗?

编辑: 经过一番调查,原来段落样式的差异实际上是由我打印“\r\n”的换行符引起的。将其更改为“\n”解决了间距问题。

最佳答案

Core Text 在 iOS 6 中进行了彻底修改。如果您拥有 Apple 开发者帐户,可以免费观看 WWDC 2012 视频来查看所有更改。

所以现在在 iOS 6 中,您不能使用任何低级别的 Core Text 属性,例如 kCTForegroundColorAttributeName 或 kCTParagraphStyleAttributeName。

相反,您可以使用一组新的高级属性,例如 NSForegroundColorAttributeName 和 NSParagraphStyle。

因此您的代码将更改为:

/*Note that you have use the Foundation class
  for the attribute value instead of it's Core-Foundation counterpart.*/

[attributes setObject:color 
           forKey:NSForegroundColorAttributeName];

CGFloat spaceBefore, spaceAfter;

NSMutableParagraphStyle *mutableParagraphStyle = [NSMutableParagraphStyle defaultParagraphStyle];
mutableParagraphStyle.paragraphSpacing = spaceAfter;
mutableParagraphStyle.paragraphSpacingBefore = spaceBefore;

[attributes setObject:mutableParagraphStyle 
           forKey:NSParagraphStyleAttributeName];

您可以在此处找到所有新属性 的文档: http://developer.apple.com/library/ios/#documentation/uikit/reference/NSAttributedString_UIKit_Additions/Reference/Reference.html

关于ios - ios 6 和 ios 5.1 之间核心文本的差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15678584/

相关文章:

ios - 在编写重复代码时如何节省时间?

ios - 为什么 Xcode 认为我的变量在应该返回 NSString 时返回了 NSURL?

objective-c - 无限水平滚动 UIScrollView

iphone - 执行多线程的正确方法

objective-c - 如何显示 [AVPlayerItemVideoOutput copyPixelBufferForItemTime :]? 的结果

iOS - TestFlight 是否具有与应用程序实时发布到 App Store 相同的严格标准?

iOS,用下载的图像替换图像

ios - 取消按钮出现但完成按钮未出现在 uitoolbar 中

ios - UITableView 的 AccessoryView 在多个单元格上重复使用

ios - 使用 setSelectedTextRange : on iOS 6 时的奇怪行为