我正在使用UIMenuItem
和UIMenuController
向我的UITextView
添加突出显示功能,因此用户可以更改背景颜色< / strong>所选文字,如下图所示:
UITextView
中的选中文字,用户可以使用突出显示功能:
UITextView
中带有新背景颜色的突出显示文字,由用户在点按突出显示功能后选择:
在 iOS 7 中,以下代码正常工作完美地完成此任务:
- (void)viewDidLoad {
[super viewDidLoad];
UIMenuItem *highlightMenuItem = [[UIMenuItem alloc] initWithTitle:@"Highlight" action:@selector(highlight)];
[[UIMenuController sharedMenuController] setMenuItems:[NSArray arrayWithObject:highlightMenuItem]];
}
- (void)highlight {
NSRange selectedTextRange = self.textView.selectedRange;
[attributedString addAttribute:NSBackgroundColorAttributeName
value:[UIColor redColor]
range:selectedTextRange];
// iOS 7 fix, NOT working in iOS 8
self.textView.scrollEnabled = NO;
self.textView.attributedText = attributedString;
self.textView.scrollEnabled = YES;
}
但在 iOS 8 中,文字选择正在跳跃。当我使用UIMenuItem
和UIMenuController
中的突出显示功能时,它也会跳转到另一个UITextView
偏移。
如何在 iOS 8 中解决此问题?
答案 0 :(得分:7)
我最终解决了这个问题,如果其他人有更优雅的解决方案,请告诉我:
- (void)viewDidLoad {
[super viewDidLoad];
UIMenuItem *highlightMenuItem = [[UIMenuItem alloc] initWithTitle:@"Highlight" action:@selector(highlight)];
[[UIMenuController sharedMenuController] setMenuItems:[NSArray arrayWithObject:highlightMenuItem]];
float sysVer = [[[UIDevice currentDevice] systemVersion] floatValue];
if (sysVer >= 8.0) {
self.textView.layoutManager.allowsNonContiguousLayout = NO;
}
}
- (void)highlight {
NSRange selectedTextRange = self.textView.selectedRange;
[attributedString addAttribute:NSBackgroundColorAttributeName
value:[UIColor redColor]
range:selectedTextRange];
float sysVer = [[[UIDevice currentDevice] systemVersion] floatValue];
if (sysVer < 8.0) {
// iOS 7 fix
self.textView.scrollEnabled = NO;
self.textView.attributedText = attributedString;
self.textView.scrollEnabled = YES;
} else {
self.textView.attributedText = attributedString;
}
}
答案 1 :(得分:0)
move self.textView.scrollEnabled = NO;到第一行高亮方法。
希望它有所帮助!