首页 > 其他分享 >IOS中的Context Menu

IOS中的Context Menu

时间:2023-02-08 11:47:50浏览次数:44  
标签:vc Menu UIContextMenuConfiguration IOS 点击 let tempV Context view

IOS中的Context Menu

  • 通过长按组件或者3D touch方式,周边全部虚化,弹出一个可操作的菜单,并且菜单之间也可以嵌套

  • IOS13之后已经弃用UIViewControllerPreviewingDelegate等方法,与之代替的是UIContextMenuInteractionDelegate

    遵循 UIContextMenuInteractionDelegate 并实现代理方法 configurationForMenuAtLocation

    UIContextMenuConfiguration 是对应弹出菜单的配置项

        lazy var config: UIContextMenuConfiguration = {
        let tempV = UIContextMenuConfiguration(identifier: nil, previewProvider: nil) { (elements) -> UIMenu? in
            
            //二级菜单数组
            var ratingActions: Array<UIAction> = []
            for i in 0..<5 {
                let action = UIAction(title: "\(i+1) 分") { (action) in
                
                }
                ratingActions.append(action)
            }
            
            let ratingMenu = UIMenu(title: "打分", image: UIImage(systemName: "star.circle"), children: ratingActions)
            
            let favoriteAction = UIAction(title: "喜欢", image: UIImage(systemName: "heart.fill"), state: .off) { (action) in
                
            }
            let shareAction = UIAction(title: "分享", image: UIImage(systemName: "square.and.arrow.up.fill"), state: .off) { (action) in
                
            }
            let deleteAction = UIAction(title: "删除", image: UIImage(systemName: "trash.fill"),attributes: [.destructive], state: .off) { (action) in
                
            }
            
            //创建一个二级菜单,并且里面还可以嵌套三级菜单、四级菜单
            let deleteMenu = UIMenu(title: "删除菜单", options: .displayInline, children: [deleteAction])
    
            // 将几个Action和一个二级菜单放到一级菜单里面
            return UIMenu(title: "菜单", children: [ratingMenu, favoriteAction, shareAction, deleteMenu])
        }
        return tempV
    }()
    
        func contextMenuInteraction(_ interaction: UIContextMenuInteraction, configurationForMenuAtLocation location: CGPoint) -> UIContextMenuConfiguration? {
        return config
    }
    

    然后给对应要预览的view添加interaction

        lazy var imageView: UIButton = {
        let tempV = UIButton()
        tempV.setImage(UIImage(named: "avatar"), for: .normal)
        tempV.frame = CGRectMake(100, 100, 200, 200)
        
        //关键代码
        ==========================================================
        let interaction = UIContextMenuInteraction(delegate: self)
        tempV.addInteraction(interaction)
        ==========================================================
                
        return tempV
    }()
    

    在UIAction的回调函数里面处理每一个item的点击事件

       let deleteAction = UIAction(title: "删除", image: UIImage(systemName: "trash.fill"),attributes: [.destructive], state: .off) { (action) in
            //处理点击
       }
    

    如果想要处理点击预览视图也就是上面代码中的imageView的事件

    需要在UIContextMenuInteractionDelegate

        func contextMenuInteraction(_ interaction: UIContextMenuInteraction, willPerformPreviewActionForMenuWith configuration: UIContextMenuConfiguration, animator: UIContextMenuInteractionCommitAnimating) {
        //处理点击预览图的逻辑
        //这里写了一个详情页的View,点击之后就会跳到详情页
        let vc = DetailViewController()
        vc.view.alpha = 0
        self.view.addSubview(vc.view)
        animator.addAnimations {
            vc.view.alpha = 1
        }
    }
    

    方法中实现对应的逻辑
    预览

  • UITableView&UICollectionView中的cell实现

    在UITableView和UICollectionView中想要实现context menu已经有封装了直接用

    UITableView为例

        func tableView(_ tableView: UITableView, contextMenuConfigurationForRowAt indexPath: IndexPath, point: CGPoint) -> UIContextMenuConfiguration? {
          return config
      }
    

    在上述代理方法中实现对每一个cell的Context Menu的配置

    然后在willPerformPreviewActionForMenuWith方法中实现对应点击cell的逻辑

    相同的,对应action的逻辑是直接写在UIContextMenuConfiguration中的

        func tableView(_ tableView: UITableView, willPerformPreviewActionForMenuWith configuration: UIContextMenuConfiguration, animator: UIContextMenuInteractionCommitAnimating) {
          //处理对应逻辑
          //这里写了一个详情页的View,点击之后就会跳到详情页
          let vc = DetailViewController()
          vc.view.alpha = 0
          self.view.addSubview(vc.view)
          animator.addAnimations {
              vc.view.alpha = 1
          }
      }
    

    预览

标签:vc,Menu,UIContextMenuConfiguration,IOS,点击,let,tempV,Context,view
From: https://www.cnblogs.com/r1cardo/p/17101155.html

相关文章

  • navMenus 的动态路由 嵌套 2
    <template><el-colid="navMenu"><el-menu:default-active="defaultActive"background-color="#0b172e"text-color="#A7B1C2"active-text-c......
  • Request-共享数据(域对象)、获取ServletContext
    Request共享数据(域对象)  共享数据:域对象:一个有作用范围的对象,可以在范围内共享数据request域:代表一次请求的范围,一般用于请求转发的多个资......
  • navMenus 的动态路由 嵌套 1
    <template> <divclass="navMenu">  <templatev-for="menuinnavMenus">   <el-submenu    :key="menu.path"    :index="menu.path"......
  • ios::sync_with_stdio(false)
    ios::sync_with_stdio(false)在C++中的输入和输出有两种方式,一种是scanf和printf另一种是cin和cout,在#include<bits/stdc++.h>这个万能头文件下,这两种方式是可以互换的......
  • go语言context教程
    预览目录Context原理遵循规则Context包WithCancel例子WithDeadline例子WithTimeout例子WithValue例子参考连接对于golang开发者来说context(上下文)包一......
  • iOS崩溃调试的使用和技巧总结
    在iOS开发调试过程中以及上线之后,程序经常会出现崩溃的问题。简单的崩溃还好说,复杂的崩溃就需要我们通过解析Crash文件来分析了,解析Crash文件在iOS开发中是比较常见的。......
  • antd-mobile 的DatePicker兼具性问题-部分机型(ios,iphone11)出现年份不显示的问题
    问题:在使用datepicker中,限制了min和max值,并且再使用min/max值时,通过newDate去转换dayjs,不兼容导致年份没有出来解决办法:通过dayjs的toDate转换iphone11中使用的newD......
  • iOS开发经验积累 二
    1.使用场景:在进入C控制器,可能有两个入口A和B控制器,从哪个入口进来,点击返回就返回哪个控制器。这样我们可以在C控制器中写上这个导航控制器的方法来判断,控制器栈中存在的是是......
  • iOS/OS X内存管理(一):基本概念与原理
    在Objective-C的内存管理中,其实就是引用计数(referencecount)的管理。内存管理就是在程序需要时程序员分配一段内存空间,而当使用完之后将它释放。如果程序员对内存资源使用......
  • Scaffold-DbContext使用教程
    1.基础准备   安装对应的三个nuget包,第二个nuget由你使用数据库决定 2.命令说明 Scaffold-DbContext为DbContext数据库的和实体类型生成代码。为了使Sca......