UITextView deaktivieren Textauswahl
-
08-07-2019 - |
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?
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.
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:
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:
- kompatibel mit isScrollEnabled
- kompatibel mit Lupe / Lupe
- aber nicht kompatibel mit Links ( sehen Sie hier eine Lösung kompatibel mit Links )
/// 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