Отключить выделение текста в UITextView

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

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

Подкласс 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

person Konstantin Cherkasov    schedule 29.06.2013    source источник


Ответы (3)


Поскольку вы уже перегружаете текстовое представление, реализуйте жестRecognizerShouldBegin: я сделал такую ​​реализацию.

-(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;
}

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

person Eric Ruck    schedule 20.08.2013

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

Документы: http://developer.apple.com/library/ios/documentation/UIKit/Reference/UITextInput_Protocol/Reference/Reference.html#//apple_ref/occ/intfp/UITextInput

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

Вот рабочий пример 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
        }
    }

}
person Konstantin Cherkasov    schedule 24.07.2014