iOS UIMenuController的使用

当你在开发app过程中,突然想往一个控件或者UITableView里面添加一个长按手势,弹出一个黑色的选择菜单时,这时候就需要使用UIMenuController了
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就会发生混乱,切记。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值