UITableview滑动菜单从iOS8开始就已经推出,方便的接口和良好的用户体验,成为了iOS区别于安卓的又一个特性,不少App中都使用到了这个特性。不过,系统默认的样式太过简陋,而Apple至今都没有给出友好的自定义方法。查看了许多教程,每每都须要遍历整个tableview,尤为是iOS11后对View的层级进行了调整,使得遍历查找更加麻烦。下面,我将提供一个更取巧的方法给你们。 bash
剩下的工做比较简单,咱们须要给UITableview添加editActions事件,不然Cell是没法拖动的。建立的UITableViewRowAction须要将backgroundColor设置为UIColor(red: 0, green: 0, blue: 0, alpha: 0)(不能设置为Clear,会显示灰色)。ui
func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {
let action = UITableViewRowAction(style: .normal, title: nil) { (action, index) in
self.delete(indexPath.row)
}
action.backgroundColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0)
return [action]
}
复制代码
这时候从新运行App,你可能看到的仍是一片空白,并无任何自定义View显示出来。要知道为何,咱们须要了解ClipToBounds属性。spa
不少人在切圆角的时候用过它,他的功能就是将View边界以外的View裁切掉。咱们回到StoryBorad或XIB,分别点击UITableViewCell和它的ContentView,将它们的ClipToBounds属性取消,这样,即使是在它们边界以外的View(例如咱们的自定义View)也能被渲染出来。code
至此,很高兴的告诉你,你的自定义按钮已经生效了。你应该能看到相似下图的效果。orm
等等,若是你使用iOS11以前的设备查看时,会发现这样一个尴尬的状况。 cdn
func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {
let action = UITableViewRowAction(style: .normal, title: nil) { (action, index) in
self.delete(indexPath.row)
}
action.title = " "
action.backgroundColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0)
return [action]
}`
复制代码
最后提一下文章开头提到的iOS11对于侧滑按钮的变化。 咱们尝试打开Debug view Hierarchy来分别查看一下不一样iOS版本下的系统层级。 blog
咱们发现,iOS11中,UISwipeActionPullView(蓝色区域)的层级在UITableview之上,这与iOS11以前的版本不同(UISwipeActionPullView在UITableviewCell之上,且置于ContentView之下)。这个变化对用户是无感的,但开发人员须要了解,以便在须要的时候进行修改。教程