2013-06-29 4 views
1

Я хочу отключить редактирование текста в UITextView, остается только курсор. Я уже отключил клавиатуру, вырезал-скопировать-вставить меню и режим редактирования масштабирования. Но есть еще одна проблема - если я дважды нажимаю на TextView, он выбирает целое слово. И еще одно: как я могу позволить курсору выбрать любое место, а не только конец или начало слова?Отключить выбор текста в UITextView

Я сделал скриншоты, которые лучше описывают мою проблему, но не могут опубликовать ее из-за репутации. Поэтому я надеюсь, что вы поймете, что я имею в виду.

Подкласс UITextView:

#import "UIUneditableTextView.h" 

@implementation UIUneditableTextView 

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     // Initialization code 
    } 
    return self; 
} 

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender 
{ 
    UIMenuController *menuController = [UIMenuController sharedMenuController]; 
    if (menuController) { 
     [UIMenuController sharedMenuController].menuVisible = NO; 
    } 
    return NO; 
} 

-(void)addGestureRecognizerForLongPress:(UIGestureRecognizer *)gestureRecognizer 
{ 
    if ([gestureRecognizer isKindOfClass:[UILongPressGestureRecognizer class]]){ 
     gestureRecognizer.enabled = NO; 
    } 
    [super addGestureRecognizer:gestureRecognizer]; 
    return; 
} 

@end 

ответ

1

Здесь приходит Swift рабочий пример

class TextView: UITextView { 

    override func canPerformAction(action: Selector, withSender sender: AnyObject!) -> Bool { 
     return false 
    } 

    override func gestureRecognizerShouldBegin(gestureRecognizer: UIGestureRecognizer!) -> Bool { 
     if gestureRecognizer.isKindOfClass(UITapGestureRecognizer) && ((gestureRecognizer as UITapGestureRecognizer).numberOfTapsRequired == 1) { 
      let touchPoint = gestureRecognizer.locationOfTouch(0, inView: self) 
      let cursorPosition = closestPositionToPoint(touchPoint) 
      selectedTextRange = textRangeFromPosition(cursorPosition, toPosition: cursorPosition) 
      return true 
     } 
     else { 
      return false 
     } 
    } 

} 
2

Посмотрите на методы в UITextInput, как это, где выбор контролируется. Вы можете действовать как inputDelegate, чтобы узнать, когда selectionWillChange: и переопределить selectedTextRange для управления выбором и кареткой.

Docs: http://developer.apple.com/library/ios/documentation/UIKit/Reference/UITextInput_Protocol/Reference/Reference.html#//apple_ref/occ/intfp/UITextInput

+1

Что вы имеете в виду «вы можете действовать как' inputDelegate'»? Я почти уверен, что вы не можете. Согласно документации Apple: «UIKit предоставляет частный делегат ввода текста, который он присваивает во время выполнения свойству' inputDelegate' объекта, класс которого использует протокол UITextInput'. –

3

Поскольку вы уже перегружает вид текста, реализующие gestureRecognizerShouldBegin: Я сделал реализацию подобного.

-(BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer { 
    // Check for gestures to prevent 
    if ([gestureRecognizer isKindOfClass:[UITapGestureRecognizer class]]) { 
     // Check for double tap 
     if (((UITapGestureRecognizer *)gestureRecognizer).numberOfTapsRequired == 2) { 
      // Prevent the double tap 
      return NO; 
     } 
    } 

    // Always anything that makes it here 
    return YES; 
} 

Возможно, вы захотите рассмотреть возможность обнаружения длинного распознавателя жестов здесь, это намного меньше взлома.