搜狐首页 教育 重明卫

手机搜狐

SOHU.COM

小码哥-解决cell点击时子视图改变背景颜色的问题

前言

iOS开发中,UITableView随处可见,而在点击UITableView的cell的时候,如果他的子视图设置了透明颜色以外的颜色,子视图的背景颜色会进行相关的改变,效果如下图。

这种情况是不是有种似曾相识的感觉

如果没有,我再举几个很多人使用的 App 上对于这种情况处理不佳的例子,注意左右对比

网上对于这种情况有很多答案,主要都是下面这种解决方式:

修改 cell 的选中样式:

cell.selectionStyle =UITableViewCellSelectionStyleNone; 这种解决方案,可以正确的达到点击的时候子视图背景颜色不再改变,只是美中不足的是,这种方法不仅去除了我们不想要的子视图背景颜色改变的效果,还去除了 cell 本身 contentView 的背景颜色改变的效果。

此时点击 cell ,用户不再会感觉到有任何变化,为了取消子视图背景颜色改变效果,而取消 cell 的选中效果,这种做法不太友好。

此时又有网友提出,自己实现这种选中效果,在 cell 的 contentView 的最下层添加一个 button,很好的思路,只是,如果此时你的 cell 已经使用 xib 布局的差不多了,或者使用纯代码写的差不多了,再向 cell 的 contentView 和你所添加的 subview 中间添加一个 button 就显得有点麻烦。

懒癌晚期,想有一劳永逸的解决办法,最好是那种不对原工程做任何改动的

在这里我的思路是:拦截 cell 的 contentView 中所有子视图的设置背景颜色的方法,并在其中打印函数调用栈,看看颜色改变前后调用了哪些方法,再进行相应的变化

cell 子视图更改颜色之前,究竟做了些什么?

我新建了一个 .m 文件,并在其中使用 runtime 的 Method Swizzle 对设置背景颜色方法进行替换,在新的设置背景颜色方法中打印函数调用栈,具体代码如下:

这里如果不懂运行时的相关用法,可以自行去了解一下 runtime 的相关使用以及概念。

然后我们进行相关测试,分别观看点击 cell 时改变子视图背景色为透明时候的函数调用栈,以及恢复子视图背景颜色为之前颜色的函数调用栈。

对比点击前后的函数调用栈,我们可以观察到,在点击 cell 的设置子视图背景颜色的前后都调用了

精选