ios

[ios - Swift] UITableView Swipe Button 만들기

POKY_0908 2020. 11. 20. 20:00

 

 

 

 

1. leadingSwipeActionsConfigurationForRowAt, trailingSwipeActionsConfigurationForRowAt

leadingSwipeActionsConfigurationForRowAt : 행의 앞 가장자리에서 표시할 스와이프 동작입니다.

trailingSwipeActionsConfigurationForRowAt : 행의 끝 가장자리에서 표시할 스와이프 동작입니다.

 

우리는 위 두 가지의 델리게이트를 이용하도록 하겠습니다.

 

func tableView(_ tableView: UITableView, leadingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
    return nil
}

func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {        
    return nil
}

 

 

 

 

2. UIContextualAction, UISwipeActionsConfiguration

 

이제 스와이프 델리게이트가 발생하면 표시할 작업을 정의해야 합니다. 

 

아래와 같이 추가해주세요.

 

func tableView(_ tableView: UITableView, leadingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {

   let mute = UIContextualAction(style: .normal, title: nil) { (action, view, completionHandler) in
       completionHandler(true)
   }

   mute.accessibilityFrame = CGRect(x: 0, y: 0, width: 30, height: tableView.rowHeight)
   mute.backgroundColor = UIColor.blue
   mute.image = UIImage(systemName: "pencil.circle")

   let config = UISwipeActionsConfiguration(actions: [mute])

   return config
}

 

func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {

    let hide = UIContextualAction(style: .normal, title: "숨김") { (action, view, completionHandler) in
        completionHandler(true)
    }

    // weak self : 클로져 내부에서 self 를 사용할 때 strong reference cycle 예방
    let delete = UIContextualAction(style: .normal, title: "차단") { [weak self] action, view, completionHandler in

        // 삭제 처리
        self!.members[indexPath.section].Members.remove(at: indexPath.row)
        tableView.deleteRows(at: [indexPath], with: .automatic)
        completionHandler(true)
    }

    hide.backgroundColor = .gray
    delete.backgroundColor = .orange

    let config = UISwipeActionsConfiguration(actions: [delete, hide])
    return config
}

 

UISwipeActions에 대한 동작은 클로져 내에서 진행하면 됩니다.

 

UISwipeActions에 대한 값을 UISwipeActionsConfiguration에 배열 형태로 넣어준 후 실행해보면 아래와 같이 동작하는 것을 확인할 수 있습니다.

 

 

 

 

행을 스와이프 하니 계속 늘어나는 걸 확인할 수 있는데 계속 늘리기 싫다면 위의 config의 설정을 바꿔야 합니다. 

 

아래와 같이 추가해주세요.

 

let config = UISwipeActionsConfiguration(actions: [delete, hide])
// 끝까지 안늘어나게 함
config.performsFirstActionWithFullSwipe = false

return config

 

 

이제 스와이프 버튼 구현을 마무리했습니다.