wake-up-neo.com

UITextView deaktiviert die Textauswahl

Es fällt mir schwer, die UITextView zu erhalten, um die Auswahl des Textes zu deaktivieren.

Ich habe es versucht:

canCancelContentTouches = YES;

Ich habe Subclassing und Überschreiben versucht:

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

(Aber das wird erst nach der Auswahl aufgerufen)

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

(Ich sehe nicht, dass das überhaupt gefeuert wird)

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

(Ich sehe nicht, dass auch gefeuert wird)

Was vermisse ich?

38
dizy

Ausgabe Deaktivieren der Optionen Kopieren, Ausschneiden, Auswählen, Alle auswählen in UITextView Hier gibt es eine praktikable Lösung, die ich gerade implementiert und überprüft habe:

Unterklasse UITextView und überschreiben canBecomeFirstResponder:

- (BOOL)canBecomeFirstResponder {
    return NO;
}

Beachten Sie, dass dies Links und andere tippbare Textinhalte deaktiviert.

76
Dafydd Williams

Ich habe diesen Ruf gefunden

[textView setUserInteractionEnabled:NO];

funktioniert ganz gut.

46
James M

UITextView s selectable property:

Diese Eigenschaft steuert die Fähigkeit des Benutzers, Inhalt und .__ auszuwählen. interagieren mit URLs und Textanhängen. Der Standardwert ist YES.

13
Heath Borders

Es klingt so, als würden Sie eigentlich ein riesiges UILabel in einer UIScrollView und keine UITextView wollen.

update: Wenn Sie eine neuere Version von iOS verwenden, verfügt UILabel jetzt über eine Lines-Eigenschaft:

Mehrere Textzeilen in UILabel

9
slf

Wenn Sie nur die Bearbeitung verhindern möchten, setzen Sie die "editable" -Eigenschaft des UITextView auf NO/False.

Wenn Sie versuchen, es bearbeitbar zu lassen, aber nicht auswählbar, wird das schwierig. Möglicherweise müssen Sie eine verborgene Textansicht erstellen, in die der Benutzer eingeben kann. Anschließend muss UITextView diese verborgene Textansicht beobachten und sich mit dem Text der Textansicht füllen. 

5
TechZen

Dazu muss die erste Unterklasse die UITextView sein 

und in der Implementierung Folgendes tun 

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

das sollte gut funktionieren, 

2
Sajad Goudarzi

Sie können die Textauswahl deaktivieren, indem Sie UITextView subclassing.

Die folgende Lösung ist:

/// 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

Haben Sie versucht, userInteractionEnabled für Ihre UITextView auf NO zu setzen? Aber Sie würden auch das Scrollen verlieren.

Wenn Sie einen Bildlauf durchführen möchten. Aus diesem Grund haben Sie wahrscheinlich ein UITextView und kein UILabel verwendet, dann müssen Sie mehr Arbeit erledigen. Sie müssen canPerformAction:withSender: wahrscheinlich überschreiben, um NO für Aktionen zurückzugeben, die Sie nicht zulassen möchten:

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

Für mehr: UIResponderStandardEditActions .

1
mahboudz

Swift 4 , Xcode 10

Diese Lösung wird 

  • markierung deaktivieren
  • aktivieren Sie das Tippen auf Links
  • scrollen zulassen

Stellen Sie sicher, dass Sie den Delegaten auf YourViewController festgelegt haben

yourTextView.delegate = yourViewControllerInstance

Dann

extension YourViewController: UITextViewDelegate {

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

}
1
Ted

Für Swift gibt es eine Eigenschaft mit dem Namen "isSelectable", deren Standardwert true ist 

sie können es wie folgt verwenden:

textView.isSelectable = false
0

Swift 4, Xcode 10:

Wenn Sie es so erstellen möchten, dass der Benutzer den Text nicht auswählen oder bearbeiten kann.

Dies macht es so, dass es nicht bearbeitet werden kann:

textView.isEditable = false

Dies deaktiviert alle Benutzerinteraktionen:

textView.isUserInteractionEnabled = false

Dies macht es so, dass Sie es nicht auswählen können. Das bedeutet, dass die Optionen zum Bearbeiten oder Einfügen nicht angezeigt werden. Ich denke, das ist, wonach du suchst.

textView.isSelectable = false
0
aaronmbmorse