显然这是一个“错误”,UITextView 似乎不像其他 UIKit 元素那样支持字距调整。是否有使字距调整正常工作的解决方法?
明确地说,我说的是字体文件中定义的字符对之间的间距,而不是所有字符之间的一般间距。使用带有 NSKernAttributeName
的 NSAttributedString
将调整所有字符之间的间距,但内置字符对仍然不起作用。
例如:
是否有解决此问题的解决方法?
我发现的一个简单解决方法是将 css 样式添加到启用字距调整的 UITextView。如果我使用未记录的方法 setContentToHTMLString:
我可以将 css 注入(inject) TextView 中的 secret webview。
NSString *css = @"*{text-rendering: optimizeLegibility;}";
NSString *html = [NSString stringWithFormat:@"<html><head><style>%@</style></head><body>Your HTML Text</body></html>", css];
[textView performSelector:@selector(setContentToHTMLString:) withObject:html];
这会立即解决问题;但是,这似乎很可能会使应用程序被拒绝。有没有一种安全的方法可以将一些 css 隐藏到 TextView 中?
我尝试过的其他解决方法包括:
使用 webview 和 contenteditable 属性。这并不理想,因为 webview 会做很多额外的事情,例如不容易隐藏的输入附件 View 。
子类化 UITextView
并使用核心文本手动呈现文本。这比我希望的要复杂,因为所有选择内容也需要重新配置。由于 UITextView
的 UITextPosition
和 UITextRange
的私有(private)子类,即使不是完全不可能,这也是一个巨大的痛苦。
最佳答案
您是对的,如果使用 @selector(setContentToHTMLString:)
,您的应用可能会被拒绝。然而,您可以使用一个简单的技巧来动态构造选择器,这样它就不会在验证期间被检测到。
NSString *css = @"*{text-rendering: optimizeLegibility;}";
NSString *html = [NSString stringWithFormat:@"<html><head><style>%@</style></head><body>Your HTML Text</body></html>", css];
@try {
SEL setContentToHTMLString = NSSelectorFromString([@[@"set", @"Content", @"To", @"HTML", @"String", @":"] componentsJoinedByString:@""]);
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
[textView performSelector:setContentToHTMLString withObject:html];
#pragma clang diagnostic pop
}
@catch (NSException *exception) {
// html+css could not be applied to text view, so no kerning
}
通过将调用包装在 @try/@catch block 中,您还可以确保如果 setContentToHTMLString:
方法在未来的 iOS 版本中被删除,您的应用程序也不会崩溃。
通常不推荐使用私有(private) API,但在这种情况下,我认为使用小技巧与使用 CoreText 重写 UITextView 相比完全有意义。
关于objective-c - iOS UITextView 中的字距调整,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13239267/