UITextViewによるテキスト選択の無効化
-
08-07-2019 - |
質問
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プロパティが追加されました:
編集を禁止する場合は、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
をサブクラス化することにより、テキスト選択を無効にできます。
以下のソリューションは次のとおりです。
- 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 {}
}
}
Swiftには、&quot; isSelectable&quot;というプロパティがあります。デフォルトでtrueに割り当てられます
次のように使用できます:
textView.isSelectable = false