質問

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

試しました:

canCancelContentTouches = YES;

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

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

(ただし、選択後にのみ呼び出されます)

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

(解雇されることはまったくありません)

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

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

不足しているものは何ですか?

役に立ちましたか?

解決

問題 UITextViewでコピー、切り取り、選択、すべて選択を無効にする方法には、実装したばかりのこれに対する有効なソリューションがあります検証済み:

サブクラス UITextView および canBecomeFirstResponder:

の上書き
- (BOOL)canBecomeFirstResponder {
    return NO;
}

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

他のヒント

その呼び出しが見つかりました

[textView setUserInteractionEnabled:NO];

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

UITextView selectable プロパティ:

  

このプロパティは、ユーザーがコンテンツを選択し、   URLやテキストの添付ファイルとやり取りします。デフォルト値はYESです。

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

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

UILabelの複数行のテキスト

編集を禁止する場合は、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 10

このソリューションは

  • 強調表示を無効にする
  • リンクのタップを有効にする
  • スクロールを許可

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のuserInteractionEnabledをNOに設定しようとしましたか?しかし、スクロールも失われます。

スクロールが必要な場合、おそらくUILabelではなくUITextViewを使用したのであれば、さらに作業を行う必要があります。おそらく、許可しないアクションに対して NO を返すには、 canPerformAction:withSender:をオーバーライドする必要があります。

- (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 をサブクラス化することにより、テキスト選択を無効にできます。

以下のソリューションは次のとおりです。

/// 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 {}
    }
}

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

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

textView.isSelectable = false
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top