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;
(я тоже не вижу, чтобы меня уволили)
что я упустил?
8 ответов
вопрос как отключить копирование, вырезать, выбрать, выбрать все в UITextView имеет работоспособное решение для этого, которое я только что реализовал и проверил:
подкласс UITextView
и заменить canBecomeFirstResponder:
- (BOOL)canBecomeFirstResponder {
return NO;
}
обратите внимание, что это отключает ссылки и другое текстовое содержимое.
UITextView
' s selectable
свойства:
это свойство управляет возможностью выбора пользователем содержимого и взаимодействие с URL-адресами и текстовыми вложениями. Значение по умолчанию-YES.
похоже, что вы действительно хотите гигантскую UILabel внутри UIScrollView, а не UITextView.
обновление: если вы находитесь на более новых версиях iOS UILabel теперь имеет свойство lines:
Если вы просто хотите предотвратить его редактирование, установите для свойства UITextView "editable" значение NO/False.
Если вы пытаетесь оставить его редактируемым, но не выбираемым, это будет сложно. Возможно, Вам потребуется создать скрытый textview, в который пользователь может ввести, а затем UITextView наблюдать, что скрытый textview и заполнить себя текстом textview.
чтобы сделать этот первый подкласс 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;
}
это должно работать нормально,
вы пытались установить 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 .
Вы можете отключить выделение текста на подклассы UITextView
.
ниже Решение:
- совместимость с isScrollEnabled
- совместимость с лупа/лупа
- но не совместим со ссылками (см. здесь решение, совместимое со ссылками)
/// 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 = {
.backgroundColor = .clear
.autoresizingMask = [.flexibleHeight, .flexibleWidth]
return
}(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 {}
}
}