我很难让UITextView
禁用文本选择。
我试过了:
canCancelContentTouches = YES;
我尝试过子类化和覆盖:
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
(但只有在选择后才会调用)
- (BOOL)touchesShouldCancelInContentView:(UIView *)view;
(我看不到被解雇)
- (BOOL)touchesShouldBegin:(NSSet *)touches
withEvent:(UIEvent *)event
inContentView:(UIView *)view;
(我也没有看到被解雇)
我错过了什么?
答案 0 :(得分:76)
问题How disable Copy, Cut, Select, Select All in UITextView有一个可行的解决方案,我刚刚实施并验证过:
子类UITextView
并覆盖canBecomeFirstResponder:
- (BOOL)canBecomeFirstResponder {
return NO;
}
请注意,这会禁用链接和其他可插入文本内容。
答案 1 :(得分:46)
我发现打电话了
[textView setUserInteractionEnabled:NO];
效果很好。
答案 2 :(得分:13)
UITextView
' selectable
财产:
此属性控制用户选择内容的能力 与URL和文本附件交互。默认值为YES。
答案 3 :(得分:9)
听起来你真正想要的是UIScrollView中的巨型UILabel,而不是UITextView。
更新:如果您使用的是较新版本的iOS,UILabel现在有一个行属性:
答案 4 :(得分:5)
如果您只是想阻止它被编辑,那么将UITextView的“可编辑”属性设置为NO / False。
如果你试图让它可编辑但不可选择,那将会很棘手。您可能需要创建一个用户可以键入的隐藏文本视图,然后让UITextView观察隐藏的textview并使用textview的文本填充自己。
答案 5 :(得分: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;
}
这应该可以正常工作,
答案 6 :(得分:1)
您是否尝试为您的UITextView设置userInteractionEnabled为NO?但是你也会失去滚动。
如果你需要滚动,这可能是你使用UITextView而不是UILabel的原因,那么你需要做更多的工作。对于您不想允许的操作,您可能必须覆盖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];
}
答案 7 :(得分: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 {}
}
}
答案 8 :(得分:1)
快捷键4 , Xcode 10
此解决方案将
确保将委托设置为YourViewController
yourTextView.delegate = yourViewControllerInstance
然后
extension YourViewController: UITextViewDelegate {
func textViewDidChangeSelection(_ textView: UITextView) {
view.endEditing(true)
}
}
答案 9 :(得分:1)
Swift 4,Xcode 10:
如果要创建文本,以便用户无法选择或编辑文本。
这使其无法编辑:
textView.isEditable = false
这将禁用所有用户交互:
textView.isUserInteractionEnabled = false
这样可以使您无法选择它。这意味着它不会显示编辑或粘贴选项。我认为这就是您要寻找的。 p>
textView.isSelectable = false
答案 10 :(得分:0)
为了迅速,有一个名为“ isSelectable”的属性,默认情况下将其分配为true
您可以按以下方式使用它:
textView.isSelectable = false