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之下)。這個變化對用戶是無感的,但開發人員須要瞭解,以便在須要的時候進行修改。教程