当你在开发app过程中,突然想往一个控件或者UITableView里面添加一个长按手势,弹出一个黑色的选择菜单时,这时候就需要使用UIMenuController了
代码块
因为我在是在每个tableView的section的header以及cell里面都添加的长按展示UIMenuController,所以底下会有两个判断,假如你只是单纯的在一个控件上添加,那你就单独看一个就可以了。
在要添加的控件的长按手势里面这样写:
//UIMenuController
//设置弹出菜单要展示的内容
let itShouCang:UIMenuItem = UIMenuItem.init(title: "收藏", action: Selector.init("favCell:"))
let itTouSu:UIMenuItem = UIMenuItem.init(title: "举报", action: Selector.init("touSuCell:"))
let itShanChu:UIMenuItem = UIMenuItem.init(title: "删除", action: "shanChu:")
let itFuZhi = UIMenuItem.init(title: "复制", action: "itfuZhi:")
let menu:UIMenuController = UIMenuController.sharedMenuController()
//设置弹出菜单小箭头的方向,down指的是朝下
menu.arrowDirection = .Down
if recognizer.state == UIGestureRecognizerState.Began {
let firstId = NSUserDefaults.standardUserDefaults().objectForKey(Constants.KEY_USERID) as! NSNumber
let view = recognizer.view
if view!.isKindOfClass(DisFlowerHeaderView){
let headerView = recognizer.view as! DisFlowerHeaderView
presslocation = recognizer.locationInView(flowerTableView)
self.headerSection = headerView.tag
let flowerList = self.flowerArr![headerView.viewSection!] as! DisFlowerList
if firstId == flowerList.userId!{//自己
menu.menuItems = [itShouCang,itTouSu,itShanChu,itFuZhi]
}else{
menu.menuItems = [itShouCang,itTouSu,itFuZhi]
}
headerView.becomeFirstResponder()
menu.setTargetRect(headerView.frame, inView: headerView.superview!)
//不要忘写这句话,这是让menuController可见的
menu.setMenuVisible(true, animated: true)
}else if view!.isKindOfClass(DisFlowerCell){
presslocation = recognizer.locationInView(flowerTableView)
pressIndex = flowerTableView.indexPathForCell(view as! DisFlowerCell)
let data = self.flowerArr![pressIndex!.section] as! DisFlowerList
let comlist = data.comments![pressIndex!.row]
if firstId == comlist.userId!{
menu.menuItems = [itTouSu,itShanChu,itFuZhi]
}else{
menu.menuItems = [itTouSu,itFuZhi]
}
let cell = recognizer.view as! DisFlowerCell
cell.becomeFirstResponder()
menu.setTargetRect(cell.frame, inView: cell.superview!)
menu.setMenuVisible(true, animated: true)
}
}
重写父类的方法,只有当点击某些action的时候才会相应:
//MARK: 返回悬浮菜单中可以显示的选项
override func canPerformAction(action: Selector, withSender sender: AnyObject?) -> Bool {
if action == Selector.init("favCell:") || action == Selector.init("touSuCell:") || action == Selector.init("shanChu:") || action == Selector.init("itfuZhi:"){
return true
}
return false
}
记住,在你自定义的cell或者控件的类里面,重写一下canBecomeFirstResponder方法,返回值置成true
override func canBecomeFirstResponder() -> Bool {
return true
}
最后,提示一下自己遇到的坑,当你在长按一个控件展示menuController时,一定要把另一个控件取消第一响应项(resignFirstResponder),不然的话之后在展示的menuController就会发生混乱,切记。