UITextView文本选择和在iOS 8中突出显示跳跃

时间:2014-10-19 18:41:12

标签: ios iphone ios7 ios8 uitextview

我正在使用UIMenuItemUIMenuController向我的UITextView添加突出显示功能,因此用户可以更改背景颜色< / strong>所选文字,如下图所示:

  • UITextView中的选中文字,用户可以使用突出显示功能:

Setected text in <code>UITextView</code>

  • UITextView中带有新背景颜色的突出显示文字,由用户在点按突出显示功能后选择: Highlighted text in <code>UITextView</code> with a new background color

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 中,文字选择正在跳跃。当我使用UIMenuItemUIMenuController中的突出显示功能时,它也会跳转到另一个UITextView偏移。

如何在 iOS 8 中解决此问题?

2 个答案:

答案 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;到第一行高亮方法。

希望它有所帮助!