如果你的App是一个阅读类的或是可预见用户会经常拷贝App里面的内容的时候,App的的复制功能就尤其显得重要。iOS中,复制功能并没有直接集成到控件当中,如果你的App需要该功能需要重写该控件并实现相应的功能。
实现步骤
1、必须要继承 UILabel,并且在子类中实现 canBecomeFirstResponder 和 canPerformAction:withSender: 方法
2、每个可以执行的操作,都要实现一个对应的方法,并且在方法中和 UIPasteboard 进行交互,
当在控制器中被初始化时,label 必须把 userInteractionEnabled 属性设置为 YES(不推荐把这个操作硬编码到子类的实现中)
3、label 中必须添加一个 UIGestureRecognizer(或者手动在子类中实现 UIResponder 的方法,例如 touchesBegan:withEvent:)
4、在响应手势识别事件的函数实现中,需要指定 UIMenuController 显示的位置,并且设为可见
最后,label 必须要成为第一响应者(first responder)
//第一步
class DIYLabel : UILabel {
override func canBecomeFirstResponder() -> Bool {
return true
}
override func canPerformAction(action: Selector, withSender sender: AnyObject?) -> Bool {
return (action == "copy:")
}
// MARK: - UIResponderStandardEditActions
override func copy(sender: AnyObject?) {
UIPasteboard.generalPasteboard().string = text
}
}
override func viewDidLoad() {
super.viewDidLoad()
//第二步
let label: DIYLabel = ...
label.userInteractionEnabled = true
view.addSubview(label)
//第三步
let gestureRecognizer = UILongPressGestureRecognizer(target: self, action: "handleLongPressGesture:")
label.addGestureRecognizer(gestureRecognizer)
}
// MARK: - UIGestureRecognizer
func handleLongPressGesture(recognizer: UIGestureRecognizer) {
if let recognizerView = recognizer.view,
recognizerSuperView = recognizerView.superview
{
//第四步
let menuController = UIMenuController.sharedMenuController()
menuController.setTargetRect(recognizerView.frame, inView: recognizerSuperView)
menuController.setMenuVisible(true, animated:true)
recognizerView.becomeFirstResponder()
}
}
另外:
在 iOS 3.2 上,开发者可以向菜单控制器中添加自定义的命令。之前没有提到的类似“定义”或者拼写检查建议这些大家很熟悉的命令,就是利用了这一特性。
UIMenuController 有一个 menuItems 属性,是一个包含 UIMenuItem 对象的 NSArray。每一个 UIMenuItem 对象都有一个 title 和 action。为了让这个菜单项命令能在菜单控制器中显示,响应者必须实现对应的方法选择器。
网友评论