uitableViewCell 左滑多个按钮

2024-08-21 08:58

本文主要是介绍uitableViewCell 左滑多个按钮,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

轻松学习之四--最简化原生效果集成UITableViewCell左滑多个按钮

字数1113  阅读2256  评论3 

侧滑删除是iOS中非常容易实现的一种效果,你只需要为你的UITableViewDataSource重写这个方法,系统就会自动添加这种操作。

    - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath

gif_01.gif

从iOS8开始,苹果开放了这样一个API:

- (nullable NSArray<UITableViewRowAction *> *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath

返回一个UITableViewRowAction数组,每一个"Action"代表一个侧滑删除的Button。这样侧滑每一行Cell可以有更多按钮提供给用户交互。


gif_02.gif

不幸地是这个API只在iOS8才有,这样iOS8以下就没办法使用到这种效果。这种情况下我们不得不使用第三方库或者自己重写UITableViewCell来“模拟”出这种效果,当然有几个库在侧滑控件上已经做得非常成熟了(这里我就推荐一个精品:https://github.com/MortimerGoro/MGSwipeTableCell 支持多种侧滑模式,算得上是侧滑控件里的玛莎拉蒂)。


但是,如果你跟我一样,更喜欢苹果的原生效果,又想在iOS8系统以下使用,那么你也许可以试下这个库 JZTableViewRowActionhttps://github.com/JazysYu/JZTableViewRowAction
只要拖两个.m文件到工程里,你的iOS8以下设备也就会自动集成这种效果了。


虽然我还是建议你至少要下载使用一次并阅读一下我的源码,不过你仍然可以在没有任何准备的情况下来看下面的讲解(下面的内容只围绕iOS8系统版本以下):

我的做法是,在侧滑出来的View(那个红色的"Delete" button),上面增加若干个我们想要的Button,所以需要找到一个合适的时机去做这个事情,我们知道,UITableViewCell有一个

- (void)willTransitionToState:(UITableViewCellStateMask)state

方法,当用户在某一行刚开始进行侧滑并且侧滑的Button还没有展现出来时,state的值就为 UITableViewCellStateShowingDeleteConfirmationMask,这个时机就再合适不过,但是,由于Cell的侧滑View是懒加载,所以这时它还没有被创建出来,但要等到与之对应的方法

- (void)didTransitionToState:(UITableViewCellStateMask)state

调用的话,却又已经展现给用户了,为时已晚,能想到的最好、最稳定的时机就是只要一过 willTransitionToState:这个方法,就开始“改造”这个View,所以最好的办法就是延时,只要这个方法一过,侧滑的View就会被创建了,之后我们可以通过遍历UICollectionViewCell的Subviews找到这个View,我们在这里模拟UITableView调用一次UITableViewDataSource的这个方法来获取外部创建的UITableViewRowAction数组:

- (nullable NSArray<UITableViewRowAction *> *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath

pic_01.png

根据数组里的每一个"rowAction"在这个View上面增加对应个数的UIButton就可以了。

但是这样返回的数组会永远是空,没错,因为UITableViewRowAction这个类在iOS8以下根本不存在,所以我们需要自己创建一个叫做UITableViewRowAction的类,再把它当作普通NSObject帮我们储存一些信息就好了,于是,在阅读@我就叫Sunny怎么了的FDStuckView源码后给我带来了许多灵感,按照他的思路,我们新建一个与UITableViewRowAction接口一模一样的类JZTableViewRowAction,在程序运行时创建一个叫UITableViewRowAction的类作为JZTableViewRowAction的子类,最后把它注册到运行时中去,这样我们就拥有了一个“很像”UITableViewRowAction类。


pic_03.png

pic_02.png

这里可能有些朋友会有疑问,为什么要创建一个JZTableViewRowAction并且根本没有用到?这个问题可以这样回答你:如果你不创建它的话,你就需要写更多的运行时代码来为你新创建的UITableViewRowAction增加方法、属性等等,所以,相比于这个情况,我更喜欢利用继承的特性来做。这样就实现了我们想要的效果:


gif_03.gif

最后JZTableViewRowAction同时也支持给侧滑控件的按钮设置图片,设置enable状态,除非必要,未来也许会增加更多可自定义接口,欢迎学习或使用https://github.com/JazysYu/JZTableViewRowAction。

我更喜欢写一些抛砖引玉的文章分享给大家,希望能给大家带来些许灵感,也欢迎微博@J_雨 一起探讨。One should coding to live,not live to coding :-).

这篇关于uitableViewCell 左滑多个按钮的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1092702

相关文章

C# 防止按钮botton重复“点击”的方法

在使用C#的按钮控件的时候,经常我们想如果出现了多次点击的时候只让其在执行的时候只响应一次。这个时候很多人可能会想到使用Enable=false, 但是实际情况是还是会被多次触发,因为C#采用的是消息队列机制,这个时候我们只需要在Enable = true 之前加一句 Application.DoEvents();就能达到防止重复点击的问题。 private void btnGenerateSh

struts2中的json返回指定的多个参数

要返回指定的多个参数,就必须在struts.xml中的配置如下: <action name="goodsType_*" class="goodsTypeAction" method="{1}"> <!-- 查询商品类别信息==分页 --> <result type="json" name="goodsType_findPgae"> <!--在这一行进行指定,其中lis是一个List集合,但

一款支持同一个屏幕界面同时播放多个视频的视频播放软件

GridPlayer 是一款基于 VLC 的免费开源跨平台多视频同步播放工具,支持在一块屏幕上同时播放多个视频。其主要功能包括: 多视频播放:用户可以在一个窗口中同时播放任意数量的视频,数量仅受硬件性能限制。支持多种格式和流媒体:GridPlayer 支持所有由 VLC 支持的视频格式以及流媒体 URL(如 m3u8 链接)。自定义网格布局:用户可以配置播放器的网格布局,以适应不同的观看需求。硬

PNG透明背景按钮的实现(MFC)

问题描述: 当前要在对话框上添加一个以两个PNG图片作为背景的按钮,PNG图的背景是透明的,按钮也要做出相同的透明效果。并且鼠标不在按钮上时,按钮显示"bg1.png";鼠标移动到按钮上时,按钮显示"bg2.png" 开发环境为VS2010。 解决办法: 使用GDI+库装载PNG图片,并使用MFC Button Control和CMFCButton类结合,调用CMFCButton

C# 如何同时Ping多个IP地址

在C#中,如果需要同时ping多个IP地址,可以采用多线程或异步编程的方式来实现,以便可以同时进行多个ping操作。以下是两种常用的方法: 方法一:使用多线程(Task 或 Thread) 使用Task是更现代和推荐的方式,因为它内置了更好的线程管理和异常处理机制。以下是一个使用Task的示例,展示如何同时ping多个IP地址: using System; using System.Co

多个vue项目部署到nginx服务器

文章目录 需求一、项目打包1.vue.config.js2.request.js文件3.打包 二、nginx配置 需求 同一个域名安装多个vue项目。 比如:域名为 https://domain.com + 后缀。那么通过不同的后缀就能去访问不同的项目地址。 https://domain.com,不加任何后缀,访问官网。 https://domain.com/admin

在幼儿园管理系统中,会议管理申请会议修改模块:多个与会人员的回显和修改(编辑)!

在幼儿园管理系统中,会议管理>申请会议>修改模块:多个与会人员的回显(复选框)和修改(编辑)!在处理与会人员的回显(复选框)和修改(编辑)出点问题。无法正确的回显(复选框)出来与会人员和修改(编辑)。 最后终于解决:修改(编辑)的思路是:先把原来的该会议记录下的所有与会人员删除,在添加,即可实现修改(编辑)功能。回显(复选框)的思路是:设置一个flag,判断一下是否要选中(复选框),即可实现

CAD 多个页面在一个任务栏图标设置

命令行输入快捷键op或: 下图打对号,确定即可。

Jasperreports+jaspersoft studio 实现单个或多个jrxml(jasper)文件生成一个pdf文件,并利用Servlet发送该pdf文件到浏览器中展示

Jasperreports+jaspersoft studio 实现单个或多个jrxml(jasper)文件生成一个pdf文件,并利用Servlet发送该pdf文件到浏览器中展示; 代码如下: Demo07.jrxml <?xml version="1.0" encoding="UTF-8"?><!-- Created with Jaspersoft Studio version 6.6.

龙芯+FreeRTOS+LVGL实战笔记(新)——05部署主按钮

本专栏是笔者另一个专栏《龙芯+RT-Thread+LVGL实战笔记》的姊妹篇,主要的区别在于实时操作系统的不同,章节的安排和任务的推进保持一致,并对源码做了改进和优化,各位可以先到本人主页下去浏览另一专栏的博客列表(目前已撰写36篇,图1所示),再决定是否订阅。此外,也可以前往本人在B站的视频合集(图2所示)观看所有演示视频,合集首个视频链接为: 借助RT-Thread和LVGL