web-dev-qa-db-ja.com

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; 

(解雇されることもわかりません)

私は何が欠けていますか?

38
dizy

問題 ITextViewでコピー、切り取り、選択、すべて選択を無効にする方法 には、これを実装して検証した実行可能なソリューションがあります。

サブクラスUITextViewおよび上書きcanBecomeFirstResponder:

- (BOOL)canBecomeFirstResponder {
    return NO;
}

これにより、リンクおよびその他のタップ可能なテキストコンテンツが無効になることに注意してください。

76
Dafydd Williams

私はその呼び出しを見つけました

[textView setUserInteractionEnabled:NO];

かなりうまくいきます。

46
James M

UITextViewの-​​ selectable プロパティ:

このプロパティは、ユーザーがコンテンツを選択し、URLやテキストの添付ファイルを操作する機能を制御します。デフォルト値はYESです。

15
Heath Borders

実際に必要なのは、UITextViewではなく、UIScrollView内の巨大なUILabelのようです。

更新:iOS UILabelの新しいバージョンを使用している場合、linesプロパティが追加されました:

ILabelの複数行のテキスト

9
slf

編集したくない場合は、UITextViewの「編集可能な」プロパティをNO/Falseに設定します。

編集可能だが選択不可のままにしようとする場合、注意が必要です。ユーザーが入力できる非表示のtextviewを作成し、UITextViewにその非表示のtextviewを観察させ、textviewのテキストを入力する必要がある場合があります。

5
TechZen

これを行うには、最初に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;
 }

これはうまくいくはずです、

3
Sajad Goudarzi

Swift 4Xcode 1

このソリューションは

  • ハイライトを無効にする
  • リンクのタップを有効にする
  • スクロールを許可する

デリゲートをYourViewControllerに設定してください。

yourTextView.delegate = yourViewControllerInstance

それから

extension YourViewController: UITextViewDelegate {

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

}
3
Ted

Swift 4、Xcode 10:

ユーザーがテキストを選択または編集できないようにする場合。

これにより、編集できなくなります。

textView.isEditable = false

これにより、すべてのユーザーインタラクションが無効になります。

textView.isUserInteractionEnabled = false

これにより、選択できなくなります。つまり、編集または貼り付けのオプションは表示されません。これがあなたが探しているものだと思います。

textView.isSelectable = false
2
aaronmbmorse

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 {}
    }
}
1
Cœur

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 をご覧ください。

1
mahboudz

Swiftには、「isSelectable」というプロパティがあり、デフォルトではtrueに割り当てられます

次のように使用できます。

textView.isSelectable = false
0