UITextView отключение выделения текста - PullRequest
38 голосов
/ 28 октября 2009

Мне трудно заставить UITextView отключить выделение текста.

Я пробовал:

canCancelContentTouches = YES;

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

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

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

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

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

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

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

Чего мне не хватает?

Ответы [ 11 ]

76 голосов
/ 28 октября 2010

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

Подкласс UITextView и перезапись canBecomeFirstResponder:

- (BOOL)canBecomeFirstResponder {
    return NO;
}

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

46 голосов
/ 17 апреля 2011

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

[textView setUserInteractionEnabled:NO];

работает довольно хорошо.

13 голосов
/ 11 февраля 2016

UITextView х selectable свойство:

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

9 голосов
/ 29 октября 2009

Звучит так, как будто вам действительно нужен гигантский UILabel внутри UIScrollView, а не UITextView.

обновление: если вы используете более новые версии iOS, у UILabel теперь есть свойство lines:

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

5 голосов
/ 28 октября 2009

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

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

3 голосов
/ 15 апреля 2017

Для этого первого подкласса 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;
 }

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

1 голос
/ 01 марта 2019

Swift 4, Xcode 10:

Если вы хотите сделать так, чтобы пользователь не мог выбирать или редактировать текст.

Это делает его таким, что его нельзя редактировать:

textView.isEditable = false

Это отключает все взаимодействия с пользователем:

textView.isUserInteractionEnabled = false

Это делает его таким, что вы не можете его выбрать. Это означает, что он не будет отображать параметры редактирования или вставки. Я думаю, это то, что вы ищете.

textView.isSelectable = false
1 голос
/ 04 ноября 2018

Swift 4 , Xcode 10

Это решение будет

  • отключить подсветку
  • включить переход по ссылкам
  • разрешить прокрутку

Убедитесь, что вы установили делегата на YourViewController

yourTextView.delegate = yourViewControllerInstance

1020 * Тогда *

extension YourViewController: UITextViewDelegate {

    func textViewDidChangeSelection(_ textView: UITextView) {
        view.endEditing(true)
    }

}
1 голос
/ 22 марта 2018

Вы можете отключить выделение текста путем создания подкласса 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 = {
        $0.backgroundColor = .clear
        $0.autoresizingMask = [.flexibleHeight, .flexibleWidth]
        return $0
    }(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 {}
    }
}
1 голос
/ 28 октября 2009

Вы пытались установить для 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 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...