objective-c - iOS UITextView 中的字距调整

标签 objective-c ios css uitextview kerning

显然这是一个“错误”,UITextView 似乎不像其他 UIKit 元素那样支持字距调整。是否有使字距调整正常工作的解决方法?

明确地说,我说的是字体文件中定义的字符对之间的间距,而不是所有字符之间的一般间距。使用带有 NSKernAttributeNameNSAttributedString 将调整所有字符之间的间距,但内置字符对仍然不起作用。

例如:

enter image description here

是否有解决此问题的解决方法?

我发现的一个简单解决方法是将 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 并使用核心文本手动呈现文本。这比我希望的要复杂,因为所有选择内容也需要重新配置。由于 UITextViewUITextPositionUITextRange 的私有(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/

相关文章:

ios - SKAction.animate 与 SKTextureAtlas 方法不动画

php - select with 300+ options 在 Chrome 上丢失样式

iphone - 在内部类中引用 iVar 时出现问题

ios - Swift:在动画播放时更改标签文本值

ios - Objective-C 创建一个 ViewController 的实例

ios - 在 React Native 中链接 Pod 的问题

html - 为嵌套在固定容器内的绝对位置设置 Z-index

php - 如何保存对 DOM 元素所做的修改?

ios - UIPopoverPresentationController 始终显示全屏模式弹出窗口

objective-c - Swift 与 Objective-C 协议(protocol)