UITextView
を取得してテキストの選択を無効にするのに苦労しています。
私はもう試した:
canCancelContentTouches = YES;
サブクラス化と上書きを試しました:
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
(ただし、選択後にのみ呼び出されます)
- (BOOL)touchesShouldCancelInContentView:(UIView *)view;
(解雇されることはまったくありません)
- (BOOL)touchesShouldBegin:(NSSet *)touches
withEvent:(UIEvent *)event
inContentView:(UIView *)view;
(解雇されることもわかりません)
私は何が欠けていますか?
問題 ITextViewでコピー、切り取り、選択、すべて選択を無効にする方法 には、これを実装して検証した実行可能なソリューションがあります。
サブクラスUITextView
および上書きcanBecomeFirstResponder:
- (BOOL)canBecomeFirstResponder {
return NO;
}
これにより、リンクおよびその他のタップ可能なテキストコンテンツが無効になることに注意してください。
私はその呼び出しを見つけました
[textView setUserInteractionEnabled:NO];
かなりうまくいきます。
UITextView
の- selectable
プロパティ:
このプロパティは、ユーザーがコンテンツを選択し、URLやテキストの添付ファイルを操作する機能を制御します。デフォルト値はYESです。
実際に必要なのは、UITextViewではなく、UIScrollView内の巨大なUILabelのようです。
更新:iOS UILabelの新しいバージョンを使用している場合、linesプロパティが追加されました:
編集したくない場合は、UITextViewの「編集可能な」プロパティを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;
}
これはうまくいくはずです、
Swift 4、Xcode 1
このソリューションは
デリゲートをYourViewControllerに設定してください。
yourTextView.delegate = yourViewControllerInstance
それから
extension YourViewController: UITextViewDelegate {
func textViewDidChangeSelection(_ textView: UITextView) {
view.endEditing(true)
}
}
Swift 4、Xcode 10:
ユーザーがテキストを選択または編集できないようにする場合。
これにより、編集できなくなります。
textView.isEditable = false
これにより、すべてのユーザーインタラクションが無効になります。
textView.isUserInteractionEnabled = false
これにより、選択できなくなります。つまり、編集または貼り付けのオプションは表示されません。これがあなたが探しているものだと思います。
textView.isSelectable = false
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 {}
}
}
UITextViewのuserInteractionEnabledをNOに設定しようとしましたか?しかし、スクロールも失われます。
スクロールが必要な場合は、おそらくUILabelではなくUITextViewを使用しているため、さらに作業を行う必要があります。おそらく、許可しないアクションに対して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];
}
詳細については、 IResponderStandardEditActions をご覧ください。
Swiftには、「isSelectable」というプロパティがあり、デフォルトではtrueに割り当てられます
次のように使用できます。
textView.isSelectable = false