2014-10-19 2 views
3

Я использую UIMenuItem и UIMenuController добавить выделения особенность моей UITextView, так что пользователь может изменить цвет фона выделенного текста, как показано на фотографии ниже:UITextView выделение текста и выделить прыжки в прошивкой 8

  • Setected текст 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 выбор текста прыгает. Когда я использую , выделите функцию от UIMenuItem и UIMenuController, она перепрыгивает и на другую UITextView офсет.

Как решить эту проблему в iOS 8?

ответ

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; 
    } 
} 
+0

большое вам спасибо !!! Я попытался исправить эту проблему с помощью: textView.scrollEnabled = false ... textView.scrollEnabled = true, но это не работает в ios 8. просто добавлено self.textView.layoutManager.allowsNonContiguousLayout = false, и все в порядке – schirrmacher

+0

Отлично. Я рад, что смогу помочь. – Winston

+0

В моем приложении отключение scrollEnabled все еще предотвращало прыжок в iOS 8, но любая попытка его повторного использования не влияла, поэтому прокрутка стала окончательно отключена после первого редактирования. Отключение allowNonContiguousLayout вместо этого избегало этой проблемы. Я не мог сказать, были ли какие-либо недостатки для этого, поэтому я снова включил его после редактирования на всякий случай. – arlomedia

0

move self.textView.scrollEnabled = NO; к первой линии метода выделения.

Надеюсь, это поможет!

+0

Спасибо за ваш ответ ЗАЗа, но это не сработало. У меня все еще такая же проблема. – Winston

+0

прокрутка в другое место или возврат в исходное положение? если вы можете надеть одну вещь, прокомментируйте этот «self.textView.attributedText = attributedString;», а затем проверьте ответ. я знаю, что я делаю это, а не выделяю текст. – ZAZ

+0

Я пробовал ваше предложение и прокручивается в другое место, а точнее в начало UITextView. И если я выбираю и выделяю в начале текста, он больше не будет прокручиваться. – Winston

Смежные вопросы