gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 07:57:30 27 4
gpt4 key购买 nike

显然这是一个“错误”,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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com