自定義UITableview左滑菜單按鈕

UITableview滑動菜單從iOS8開始就已經推出,方便的接口和良好的用戶體驗,成爲了iOS區別於安卓的又一個特性,不少App中都使用到了這個特性。不過,系統默認的樣式太過簡陋,而Apple至今都沒有給出友好的自定義方法。查看了許多教程,每每都須要遍歷整個tableview,尤爲是iOS11後對View的層級進行了調整,使得遍歷查找更加麻煩。下面,我將提供一個更取巧的方法給你們。 bash

屏幕快照 2018-01-12 10.06.03.png
方法其實很簡單,咱們在StoryBoard或XIB中畫控件的時候,將咱們的自定義View添加到Cell的右側,給定約束,其中最重要的是該自定義View到Cell右側的距離。根據AutoLayout的設定,不管Cell在屏幕的哪裏,右側的自定義View都會保持在Cell右側與其保持一個固定的距離。這樣,當咱們向左拖動Cell的時候,右側的View也會被一併拖過來。就是這!麼!簡!單!

剩下的工做比較簡單,咱們須要給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

屏幕快照 2018-01-12 10.25.53.png

至此,很高興的告訴你,你的自定義按鈕已經生效了。你應該能看到相似下圖的效果。orm

IMG_F424D6ED641E-1.jpeg

等等,若是你使用iOS11以前的設備查看時,會發現這樣一個尷尬的狀況。 cdn

IMG_0052.PNG
按鈕只顯示了一半,或者說,拖出來的距離很是小。咱們打開視圖查看一下。
iOS10
UISwipeActionPullView很是小,而Cell被拖出來的距離應該是由這個UISwipeActionPullView的大小決定的。那麼如何控制UISwipeActionPullView的大小呢?系統沒有暴露出UISwipeActionPullView,難道還要遍歷一遍TableView?其實UITableViewRowAction有一個屬性title,這個UISwipeActionPullView的大小,或者說Cell被拖出來的距離,就是由title的長度決定的。聰明的你必定想到了,只須要給title賦一堆空格就能解決問題了。

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
iOS11
iOS10
iOS10

咱們發現,iOS11中,UISwipeActionPullView(藍色區域)的層級在UITableview之上,這與iOS11以前的版本不同(UISwipeActionPullView在UITableviewCell之上,且置於ContentView之下)。這個變化對用戶是無感的,但開發人員須要瞭解,以便在須要的時候進行修改。教程

相關文章
相關標籤/搜索