UITextView отключение выделения текста

мне трудно получить UITextView чтобы отключить выделение текста.

Я пробовал:

canCancelContentTouches = YES;

Я пробовал подклассы и перезаписи:

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender   

(но это вызывается только после выбора)

- (BOOL)touchesShouldCancelInContentView:(UIView *)view;  

(Я не вижу, что уволят всех)

- (BOOL)touchesShouldBegin:(NSSet *)touches
                 withEvent:(UIEvent *)event
             inContentView:(UIView *)view; 

(я тоже не вижу, чтобы меня уволили)

что я упустил?

8 ответов


вопрос как отключить копирование, вырезать, выбрать, выбрать все в UITextView имеет работоспособное решение для этого, которое я только что реализовал и проверил:

подкласс UITextView и заменить canBecomeFirstResponder:

- (BOOL)canBecomeFirstResponder {
    return NO;
}

обратите внимание, что это отключает ссылки и другое текстовое содержимое.


Я нашел этот вызов

[textView setUserInteractionEnabled:NO];

работает достаточно хорошо.


UITextView ' s selectable свойства:

это свойство управляет возможностью выбора пользователем содержимого и взаимодействие с URL-адресами и текстовыми вложениями. Значение по умолчанию-YES.


похоже, что вы действительно хотите гигантскую UILabel внутри UIScrollView, а не UITextView.

обновление: если вы находитесь на более новых версиях iOS UILabel теперь имеет свойство lines:

несколько строк текста в UILabel


Если вы просто хотите предотвратить его редактирование, установите для свойства UITextView "editable" значение NO/False.

Если вы пытаетесь оставить его редактируемым, но не выбираемым, это будет сложно. Возможно, Вам потребуется создать скрытый textview, в который пользователь может ввести, а затем UITextView наблюдать, что скрытый textview и заполнить себя текстом textview.


чтобы сделать этот первый подкласс UITextView

и в реализации сделайте следующее

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event
{
    self.selectable = NO;
}

- (void)touchesCancelled:(nullable NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event
{
        self.selectable = YES;
 }

это должно работать нормально,


вы пытались установить userInteractionEnabled в NO для вашего UITextView? Но вы также потеряете прокрутку.

Если вам нужна прокрутка, поэтому, вероятно, вы использовали UITextView, а не UILabel, вам нужно сделать больше работы. Вероятно, вам придется переопределить canPerformAction:withSender: вернуться NO для действий, которые вы не хотите разрешать:

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
    switch (action) {
        case @selector(paste:):
        case @selector(copy:):
        case @selector(cut:):
        case @selector(cut:):
        case @selector(select:):
        case @selector(selectAll:):
        return NO;
    }
    return [super canPerformAction:action withSender:sender];
}

больше, UIResponderStandardEditActions .


Вы можете отключить выделение текста на подклассы UITextView.

ниже Решение:

/// Class to disallow text selection
/// while keeping support for loupe/magnifier and scrolling
/// https://stackoverflow.com/a/49428248/1033581
class UnselectableTextView: UITextView {

    override init(frame: CGRect, textContainer: NSTextContainer?) {
        super.init(frame: frame, textContainer: textContainer)
        commonInit()
    }
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        commonInit()
    }
    private func commonInit() {
        // prevents selection from loupe/magnifier (_UITextSelectionForceGesture), multi tap, tap and a half, etc.
        // without losing the loupe/magnifier or scrolling
        // but we lose taps on links
        addSubview(transparentOverlayView)
    }
    let transparentOverlayView: UIView = {
        .backgroundColor = .clear
        .autoresizingMask = [.flexibleHeight, .flexibleWidth]
        return 
    }(UIView())
    override var contentSize: CGSize {
        didSet {
            transparentOverlayView.frame = CGRect(origin: .zero, size: contentSize)
        }
    }

    // required to prevent blue background selection from any situation
    override var selectedTextRange: UITextRange? {
        get { return nil }
        set {}
    }
}