46

UITextViewテキストの選択を無効にするのに苦労しています。

私はもう試した:

canCancelContentTouches = YES;

サブクラス化と上書きを試しました:

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

(しかし、それは選択後にのみ呼び出されます)

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

(私はそれがまったく解雇されるのを見ません)

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

(私もそれが解雇されるのを見ません)

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

4

11 に答える 11

76

問題UITextViewでコピー、切り取り、選択、すべて選択を無効にする方法には、実装して検証したばかりのこれに対する実行可能な解決策があります。

サブクラスUITextView化して上書きcanBecomeFirstResponder:

- (BOOL)canBecomeFirstResponder {
    return NO;
}

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

于 2010-10-28T01:07:44.413 に答える
46

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

[textView setUserInteractionEnabled:NO];

非常にうまく機能します。

于 2011-04-17T03:08:57.043 に答える
20

UITextViewselectableプロパティ:

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

于 2016-02-11T20:34:29.013 に答える
11

Swift 4、Xcode 10:

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

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

textView.isEditable = false

これにより、すべてのユーザー操作が無効になります。

textView.isUserInteractionEnabled = false

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

textView.isSelectable = false
于 2019-03-01T03:22:52.847 に答える
9

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

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

UILabelの複数行のテキスト

于 2009-10-28T21:04:25.627 に答える
8

Swift 4Xcode 10

このソリューションは

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

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

yourTextView.delegate = yourViewControllerInstance

それで

extension YourViewController: UITextViewDelegate {

    func textViewDidChangeSelection(_ textView: UITextView) {
        if #available(iOS 13, *) {
            textView.selectedTextRange = nil
        } else {
            view.endEditing(true)
        }
    }

}
于 2018-11-04T18:53:07.120 に答える
5

編集されないようにするだけの場合は、UITextViewの「編集可能」プロパティをNO/Falseに設定します。

編集可能であるが選択できないままにしようとしている場合、それは注意が必要です。ユーザーが入力できる非表示のテキストビューを作成してから、UITextViewにその非表示のテキストビューを監視させ、テキストビューのテキストを入力する必要がある場合があります。

于 2009-10-28T19:28:16.257 に答える
3

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

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

于 2017-04-15T13:24:01.253 に答える
1

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

詳細については、UIResponderStandardEditActionsをご覧ください。

于 2009-10-28T19:32:22.630 に答える
1

サブクラス化することでテキスト選択を無効にできます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 {}
    }
}
于 2018-03-22T12:04:10.747 に答える
0

swiftの場合、「isSelectable」と呼ばれるプロパティがあり、デフォルトでtrueに割り当てられます

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

textView.isSelectable = false
于 2018-10-22T09:08:17.217 に答える