Frage

Ich habe eine harte Zeit mit der UITextView immer die Auswahl des Textes zu deaktivieren.

Ich habe versucht:

canCancelContentTouches = YES;

Ich habe versucht, Subklassen und Überschreibung:

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

(Aber das erst nach der Auswahl aufgerufen wird)

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

(ich sehe nicht, dass überhaupt gefeuert)

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

(ich sehe nicht, dass entweder gefeuert)

Was bin ich fehlt?

War es hilfreich?

Lösung

Wie deaktivieren Kopieren, Ausschneiden, auswählen, alle in UITextView eine praktikable Lösung für dieses Problem hat, die ich gerade implementiert haben und überprüft:

Subclass UITextView und überschreiben canBecomeFirstResponder:

- (BOOL)canBecomeFirstResponder {
    return NO;
}
Hinweis

, dass diese deaktiviert Links und anderen entnehmbare Textinhalt.

Andere Tipps

Ich habe das Aufruf gefunden

[textView setUserInteractionEnabled:NO];

funktioniert ganz gut.

UITextView href="https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITextView_Class/#//apple_ref/occ/instp/UITextView/selectable" rel="noreferrer"> selectable Eigenschaft:

  

Diese Eigenschaft steuert die Fähigkeit des Benutzers Inhalte auszuwählen und   mit URLs und Textanhängen in Wechselwirkung treten. Der Standardwert ist YES.

Es klingt wie das, was Sie wirklich wollen, ein Riese UILabel in einem UIScrollView ist, und nicht ein UITextView.

Update: Wenn Sie auf neuere Versionen von iOS UILabel sind verfügt nun über eine Linien-Eigenschaft:

Mehrere Textzeilen in UILabel

Wenn Sie nur wollen, um es zu verhindern, dass gerade bearbeitet wird, dann ist der „editierbar“ Eigenschaft auf NO / Falsch des UITextView gesetzt.

Wenn Sie versuchen, es editierbar zu verlassen, aber nicht ausgewählt werden, das wird schwierig sein. Man könnte eine versteckte Textview erstellen müssen, dass der Benutzer in eingeben können und dann haben UITextView, dass versteckte Textview beobachten und füllen sich mit dem Text des Textview.

Diese erste Unterklasse tun, um die UITextView

und bei der Umsetzung gehen Sie wie folgt

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

Dies sollte funktionieren,

Swift 4 , Xcode 10

Diese Lösung wird

  • disable Hervorhebung
  • Aktivieren tippen Links
  • erlauben Scrollen

Stellen Sie sicher, stellen Sie die Delegierten YourViewController

yourTextView.delegate = yourViewControllerInstance

Dann

extension YourViewController: UITextViewDelegate {

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

}

Swift 4, Xcode 10:

Wenn Sie wollen, es zu machen, damit der Benutzer nicht in der Lage ist, wählen oder den Text zu bearbeiten.

Das macht es so nicht mehr bearbeitet werden kann:

textView.isEditable = false

Dies deaktiviert alle Interaktion mit dem Benutzer:

textView.isUserInteractionEnabled = false

Das macht es so, dass Sie es nicht auswählen können. Das heißt es wird die Bearbeitung oder Paste Optionen nicht zeigen. Ich denke, das ist das, was Sie suchen.

textView.isSelectable = false

Haben Sie versucht userInteractionEnabled auf NO für Ihre UITextView Einstellung? Aber Sie würden verlieren zu scrollen.

Wenn Sie Scrollen, was wahrscheinlich ist, warum Sie eine UITextView verwendet und kein UILabel, dann brauchen Sie mehr Arbeit zu tun. Sie werden wahrscheinlich canPerformAction:withSender: außer Kraft setzen müssen, um NO für Aktionen zurückzukehren, die Sie wollen nicht zulassen:

- (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 .

Sie können Textauswahl deaktivieren, indem Sie Subklassen UITextView.

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 {}
    }
}

Für die schnellen, gibt es eine Eigenschaft namens „isSelectable“ und seine standardmäßig auf true zuweisen

Sie können es wie folgt verwendet werden:

textView.isSelectable = false
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top