it-swarm.com.ru

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; 

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

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

38
dizy

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

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

- (BOOL)canBecomeFirstResponder {
    return NO;
}

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

76
Dafydd Williams

Я нашел это призвание

[textView setUserInteractionEnabled:NO];

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

46
James M

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

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

13
Heath Borders

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

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

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

9
slf

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

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

5
TechZen

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

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

2
Sajad Goudarzi

Вы можете отключить выделение текста, создав подкласс 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
Cœur

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

1
mahboudz

Swift 4 , Xcode 10

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

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

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

yourTextView.delegate = yourViewControllerInstance

Затем

extension YourViewController: UITextViewDelegate {

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

}
1
Ted

Для Swift есть свойство с именем isSelectable и его по умолчанию присваивается значение true 

вы можете использовать его следующим образом:

textView.isSelectable = false
0
Mohammed Ali Khaled

Swift 4, Xcode 10:

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

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

textView.isEditable = false

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

textView.isUserInteractionEnabled = false

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

textView.isSelectable = false
0
aaronmbmorse