IOS中的Context Menu
IOS中的Context Menu
通过长按组件或者3D touch方式,周边全部虚化,弹出一个可操作的菜单,并且菜单之间也可以嵌套
IOS13之后已经弃用
UIViewControllerPreviewingDelegate等方法,与之代替的是UIContextMenuInteractionDelegate遵循
UIContextMenuInteractionDelegate并实现代理方法configurationForMenuAtLocationUIContextMenuConfiguration是对应弹出菜单的配置项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
}
}
IOS中的Context Menu的更多相关文章
- 手机浏览器中屏蔽img的系统右键菜单context menu
我们知道通过oncontextmenu事件可以屏蔽浏览器右键菜单 $('img').on("contextmenu",function(E){E.preventDefault(); ...
- 添加删除系统右键菜单(就是上下文菜单,也就是Context Menu)中的一些选项
随着电脑安装的东西越来越多,右侧菜单也原来越长,很不方面.所以打算清理一下 我删除的大约以下几个,友好一点的都可以配置.当然也可以通过注册表直接删除. 特:注册表备份,即导入导出,避免一失足成千古恨. ...
- Quartz 2D在ios中的使用简述二:创建画布
在iOS中使用Quartz画图时,第一步就是要获取画布(图形上下文),然后再画布上做各种操作.先看下CoreGraphics.h这个头文件,就可以知道能够创建多少种上下文类型. #include &l ...
- iOS开发——高级篇——iOS中常见的设计模式(MVC/单例/委托/观察者)
关于设计模式这个问题,在网上也找过一些资料,下面是我自己总结的,分享给大家 如果你刚接触设计模式,我们有好消息告诉你!首先,多亏了Cocoa的构建方式,你已经使用了许多的设计模式以及被鼓励的最佳实践. ...
- iOS中的数据持久化方式
iOS中的数据持久化方式,基本上有以下四种:属性列表.对象归档.SQLite3和Core Data. 1.属性列表 涉及到的主要类:NSUserDefaults,一般 [NSUserDefaults ...
- (转)如何处理iOS中照片的方向
如何处理iOS中照片的方向 31 May 2015 • 7 min. read • Comments 使用过iPhone或者iPad的朋友在拍照时不知是否遇到过这样的问题,将设备中的照片导出到Wind ...
- Android Contextual Menus之一:floating context menu
Android Contextual Menus之一:floating context menu 上下文菜单 上下文相关的菜单(contextual menu)用来提供影响UI中特定item或者con ...
- iOS中JS 与OC的交互(JavaScriptCore.framework)
iOS中实现js与oc的交互,目前网上也有不少流行的开源解决方案: 如:react native 当然一些轻量级的任务使用系统提供的UIWebView 以及JavaScriptCore.framewo ...
- IOS 中的CoreImage框架
IOS 中的CoreImage框架(framework) - time4cnblogs 时间 2014-03-15 00:24:00 博客园-所有随笔区原文 http://www.cnblogs. ...
- Android 和iOS 中关于View 的一点知识
View的概念和方法十分重要,这里将对Android 和iOS中出现的,关于视图的一些知识点进行总结,预计文章会比较长,要许多时间慢慢补充. 先转载一部分资料,感谢原作者! 原链接为:http://b ...
随机推荐
- 暑集假训SCP提高拟模21
\[だから妄想感傷代償連盟 \] \[愛を懐いて理想を叫んだ \] \[行き場のない愚者のメロディー \] \[再挑戦•転生•テレポーテーション \] \[何回だって 重ねて逝くんだ \] \[終わり ...
- 以后基于 Topass 的博客加密方法通告
Topass 加密方法 以后会将部分未公开内容公开,请你通过此加密途径来破解密码 特别地,为了保证博客的浏览体验,我不会通过这种方法加密任何一种应该公开的文章 话说你们不妨猜猜用的什么算法
- SXYZ-7.3训练赛
T1 房 啥啥啥,T1又又又爆了,整个人精神状态 良好. 解题思路 考虑数据保证任意两个房子不重合 建一个结构体存两边 最后判断一下 \(>t\) 加两个 \(==t\) 加一个 == 但是!! ...
- Nuxt.js 应用中的 app:redirected 钩子详解
title: Nuxt.js 应用中的 app:redirected 钩子详解 date: 2024/10/3 updated: 2024/10/3 author: cmdragon excerpt: ...
- USB总线-Linux内核USB3.0设备控制器中断处理程序分析(九)
1.概述 USB设备枚举.请求处理.数据交互都涉及USB设备控制器中断.当有事件发生时,USB设备控制器首先将事件信息通过DMA写入到事件缓冲区中,然后向CPU发出中断,随后CPU调用中断处理函数开始 ...
- MMU和SMMU IOMMU使用场景和区别,SMMU技术与cache
1.各种MMU MMU是memory manage unit 内存管理单元: SMMU是system memory manage unit 系统内存管理单元: IOMMU和SMMU的功能基本相同,只是 ...
- 进程切换分析(2):TLB处理
一.前言 进程切换是一个复杂的过程,本文不准备详细描述整个进程切换的方方面面,而是关注进程切换中一个小小的知识点:TLB的处理.为了能够讲清楚这个问题,我们在第二章描述在单CPU场景下一些和TLB相关 ...
- 进程管理中的active_mm是做什么的?
在Linux内核中,进程管理涉及到许多复杂的数据结构和机制,其中active_mm是与内存管理相关的一个关键概念.理解active_mm需要先了解与之相关的一些基本内核结构和概念. 基本概念 mm_s ...
- ORM底层逻辑
1 数据库必然是只认识Sql语句 2 ORM的底层必然是ADO.NET 3 ORM也可以说是ADO的一种封装 ORM: 1 通过实体生成Sql语句-大量的反射 2 对应映射关系
- 58. vue常用的api
1. nextTick 使用场景:通过异步渲染的页面解构不能直接dom操作,要使用 nextTick (延迟回调)等待一下 :nextTick 的作用:感知dom的更新完成,类似于 updated ...