在 UITextView (swift) 中禁用光标和 copy/paste
Disable cursor and copy/paste in UITextView (swift)
我有一个 UITextField
,我使用 UIPickerView
作为它的 inputView
。用户可以 select 来自选择器的值,selected 值会填充到我的 TextInput
中。
这种安排工作正常,但存在以下问题:
1) 我想禁用仍然显示在 UITextField
中的光标。
我尝试禁用 UITextField
,但随后它不响应触摸,然后 UIPickerView
不显示 - 这使其无用。
2)由于显示了选择器并且用户没有在文本字段上点击键盘,因此用户无法键入任何内容,但仍然可以通过长按粘贴从其他地方复制的文本。我怎样才能禁用它?
我无法在网上找到相关信息。我应该为此使用 Label
还是 Button
而不是 UITextInput
?
UITextField
委托可以实现 textFieldShouldBeginEditing
方法。如果那个方法总是returns NO
,那么光标将永远不会出现,长按也不会被允许。
调用方法时,可以显示UIPickerView
。但是,UIPickerView
不能是 inputView
。它需要是您从底部开始制作动画的标准 UIView
的子级。或者您可以根据需要使用 UIView
的 hidden
属性 到 hide/show 视图。
我认为简单的方法是用按钮代替 UITextField
抱歉 - 这不适用于 Swift
它适用于 Obj-C
但这是想法:
要用 UITextField
做你想做的事,你必须对 UITextField
进行子类化,并尝试将此代码用于 disable/hide 插入符并输入 (copy/paste)
- (CGRect) caretRectForPosition:(UITextPosition*) position
{
return CGRectZero;
}
- (NSArray *)selectionRectsForRange:(UITextRange *)range
{
return nil;
}
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
if (action == @selector(copy:) || action == @selector(selectAll:) || action == @selector(paste:))
{
returnNO;
}
return [super canPerformAction:action withSender:sender];
}
示例来自此处:http://b2cloud.com.au/tutorial/disabling-the-caret-and-text-entry-in-uitextfields/
无论如何...这是一个 "functional" 示例:https://github.com/hackiftekhar/IQDropDownTextField
就像TonyMkenu说的,你需要继承UITextField,然后实现他上面的方法。这是 Swift 给那些不认识 Objective C 的人:
override func caretRectForPosition(position: UITextPosition!) -> CGRect {
return CGRect.zeroRect
}
override func selectionRectsForRange(range: UITextRange) -> [AnyObject] {
return []
}
override func canPerformAction(action: Selector, withSender sender: AnyObject?) -> Bool {
// Disable copy, select all, paste
if action == Selector("copy:") || action == Selector("selectAll:") || action == Selector("paste:") {
return false
}
// Default
return super.canPerformAction(action, withSender: sender)
}
完全愚蠢的 hack,但如果您在 Interface Builder UIView
部分中设置文本字段的色调颜色 属性 检查器以匹配背景颜色,则光标将不可见:
SWIFT 4
创建 TextField.swift 文件并更改 import Foundation 以导入 UIKit 并在 TextFeild.swift 文件中添加以下代码
import UIKit
class TextFeild: UITextField {
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
// write code here what ever you want to change property for textfeild.
}
override func caretRect(for position: UITextPosition) -> CGRect {
return CGRect.zero
}
override func selectionRects(for range: UITextRange) -> [Any] {
return []
}
override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
if action == #selector(UIResponderStandardEditActions.copy(_:)) || action == #selector(UIResponderStandardEditActions.selectAll(_:)) || action == #selector(UIResponderStandardEditActions.paste(_:)) {
return false
}
// Default
return super.canPerformAction(action, withSender: sender)
}
}
转到 main.storyboard,select 该文本字段并将其自定义 class 更改为 TextField
我有一个 UITextField
,我使用 UIPickerView
作为它的 inputView
。用户可以 select 来自选择器的值,selected 值会填充到我的 TextInput
中。
这种安排工作正常,但存在以下问题:
1) 我想禁用仍然显示在 UITextField
中的光标。
我尝试禁用 UITextField
,但随后它不响应触摸,然后 UIPickerView
不显示 - 这使其无用。
2)由于显示了选择器并且用户没有在文本字段上点击键盘,因此用户无法键入任何内容,但仍然可以通过长按粘贴从其他地方复制的文本。我怎样才能禁用它?
我无法在网上找到相关信息。我应该为此使用 Label
还是 Button
而不是 UITextInput
?
UITextField
委托可以实现 textFieldShouldBeginEditing
方法。如果那个方法总是returns NO
,那么光标将永远不会出现,长按也不会被允许。
调用方法时,可以显示UIPickerView
。但是,UIPickerView
不能是 inputView
。它需要是您从底部开始制作动画的标准 UIView
的子级。或者您可以根据需要使用 UIView
的 hidden
属性 到 hide/show 视图。
我认为简单的方法是用按钮代替 UITextField
抱歉 - 这不适用于 Swift
它适用于 Obj-C
但这是想法:
要用 UITextField
做你想做的事,你必须对 UITextField
进行子类化,并尝试将此代码用于 disable/hide 插入符并输入 (copy/paste)
- (CGRect) caretRectForPosition:(UITextPosition*) position
{
return CGRectZero;
}
- (NSArray *)selectionRectsForRange:(UITextRange *)range
{
return nil;
}
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
if (action == @selector(copy:) || action == @selector(selectAll:) || action == @selector(paste:))
{
returnNO;
}
return [super canPerformAction:action withSender:sender];
}
示例来自此处:http://b2cloud.com.au/tutorial/disabling-the-caret-and-text-entry-in-uitextfields/
无论如何...这是一个 "functional" 示例:https://github.com/hackiftekhar/IQDropDownTextField
就像TonyMkenu说的,你需要继承UITextField,然后实现他上面的方法。这是 Swift 给那些不认识 Objective C 的人:
override func caretRectForPosition(position: UITextPosition!) -> CGRect {
return CGRect.zeroRect
}
override func selectionRectsForRange(range: UITextRange) -> [AnyObject] {
return []
}
override func canPerformAction(action: Selector, withSender sender: AnyObject?) -> Bool {
// Disable copy, select all, paste
if action == Selector("copy:") || action == Selector("selectAll:") || action == Selector("paste:") {
return false
}
// Default
return super.canPerformAction(action, withSender: sender)
}
完全愚蠢的 hack,但如果您在 Interface Builder UIView
部分中设置文本字段的色调颜色 属性 检查器以匹配背景颜色,则光标将不可见:
SWIFT 4
创建 TextField.swift 文件并更改 import Foundation 以导入 UIKit 并在 TextFeild.swift 文件中添加以下代码
import UIKit
class TextFeild: UITextField {
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
// write code here what ever you want to change property for textfeild.
}
override func caretRect(for position: UITextPosition) -> CGRect {
return CGRect.zero
}
override func selectionRects(for range: UITextRange) -> [Any] {
return []
}
override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
if action == #selector(UIResponderStandardEditActions.copy(_:)) || action == #selector(UIResponderStandardEditActions.selectAll(_:)) || action == #selector(UIResponderStandardEditActions.paste(_:)) {
return false
}
// Default
return super.canPerformAction(action, withSender: sender)
}
}
转到 main.storyboard,select 该文本字段并将其自定义 class 更改为 TextField