Swift - 单元格滑动按钮库SwipeCellKit使用详解3(自动扩展样式)
作者:hangge | 2017-12-27 08:10
四、设置自动扩展样式(Expansion Styles)
在我们滑动单元格的过程中,事件按钮不断地显露出来。当按钮全部显示完毕后,我们其实还是可以继续滑动单元格。而扩展样式就用来描述当单元格滑过预定义的阈值时的行为。
1,自带的几种扩展样式
(1)SwipeCellKit 在 SwipeExpansionStyle 里一共内置了 3 种展开样式。具体效果如下:
- .none:不扩展,抬起手指则还原。

- .selection:扩展时自动执行最后一个按钮动作。

- .destructive:扩展时自动删除当前 cell。

(2)同样通过 editActionsOptionsForRowAt 这个代理方法,我们可以设置扩展样式。这里以 .destructive 样式为例。

注意:
内置的 .destructive 扩展样式在调用时会自动执行行删除。而我们的删除行为可能需要与其他行动画(如内部 beginUpdates 和 endUpdates )进行协调。在这种情况下,需要将 automaticallyDelete参数设置为 false,然后再手动执行删除。
内置的 .destructive 扩展样式在调用时会自动执行行删除。而我们的删除行为可能需要与其他行动画(如内部 beginUpdates 和 endUpdates )进行协调。在这种情况下,需要将 automaticallyDelete参数设置为 false,然后再手动执行删除。
import UIKit
import SwipeCellKit
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource,
SwipeTableViewCellDelegate{
var tableView:UITableView?
var items = ["这个是条目1","这个是条目2","这个是条目3","这个是条目4",
"这个是条目5","这个是条目6","这个是条目7","这个是条目8",]
override func viewDidLoad() {
super.viewDidLoad()
//创建表格视图
self.tableView = UITableView(frame:self.view.frame, style:.plain)
self.tableView!.delegate = self
self.tableView!.dataSource = self
//创建一个重用的单元格
self.tableView!.register(SwipeTableViewCell.self,
forCellReuseIdentifier: "SwiftCell")
self.view.addSubview(self.tableView!)
}
//在本例中,有1个分区
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
//返回表格行数(也就是返回控件数)
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return items.count
}
//创建各单元显示内容(创建参数indexPath指定的单元)
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath)
-> UITableViewCell {
//为了提供表格显示性能,已创建完成的单元需重复使用
let identify:String = "SwiftCell"
//同一形式的单元格重复使用,在声明时已注册
let cell = tableView.dequeueReusableCell(
withIdentifier: identify, for: indexPath) as! SwipeTableViewCell
cell.delegate = self
cell.textLabel?.text = items[indexPath.row]
return cell
}
//自定义滑动按钮
func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath,
for orientation: SwipeActionsOrientation) -> [SwipeAction]? {
//分别返回左侧、右侧的按钮
if orientation == .left {
//返回左侧事件按钮
return nil
} else{
//创建“旗标”事件按钮
let favoriteAction = SwipeAction(style: .default, title: "旗标") {
action, indexPath in
UIAlertController.showAlert(message: "点击了“旗标”按钮")
}
favoriteAction.backgroundColor = .orange
//创建“删除”事件按钮
let deleteAction = SwipeAction(style: .destructive, title: "删除") {
action, indexPath in
//将对应条目的数据删除
self.items.remove(at: indexPath.row)
tableView.reloadData()
}
//返回右侧事件按钮
return [deleteAction, favoriteAction]
}
}
//自定义滑动行为(可选)
func tableView(_ tableView: UITableView,
editActionsOptionsForRowAt indexPath: IndexPath,
for orientation: SwipeActionsOrientation) -> SwipeTableOptions {
var options = SwipeTableOptions()
options.transitionStyle = .border //变化样式(使用默认的不变)
options.expansionStyle = .destructive(automaticallyDelete: false) //扩展样式
return options
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
//扩展UIAlertController
extension UIAlertController {
//在指定视图控制器上弹出普通消息提示框
static func showAlert(message: String, in viewController: UIViewController) {
let alert = UIAlertController(title: nil, message: message, preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "确定", style: .cancel))
viewController.present(alert, animated: true)
}
//在根视图控制器上弹出普通消息提示框
static func showAlert(message: String) {
if let vc = UIApplication.shared.keyWindow?.rootViewController {
showAlert(message: message, in: vc)
}
}
}
(3).destructive 扩展样式还有一个注意的地方是:默认当其扩展行为执行时(拖动到一定距离后,或者松手),会立刻执行按钮动作,比如上面样例单元格直接消失。
我们可以将 timing 属性设置为 .after,待扩展动画完毕后再去执行按钮动作,删除单元格数据。
options.expansionStyle = .destructive(automaticallyDelete: false, timing: .after)
2,自定义扩展样式
(1)我们也可以直接使用 SwipeExpansionStyle 来创建自定义的扩展样式,该类型有如下几个参数属性可以设置:
- target:相对目标的扩展阈值。当达到这个指定值时,则发生扩展。
- additionalTriggers:额外的触发器,用于确定是否应该扩展。
- elasticOverscroll:是否弹性覆盖。指定按钮是否应该扩展到整个过度滚动量(overscroll),还是按比例展开。
- completionAnimation:指定扩展动画的完成样式。
- minimumTargetOverscroll:如果配置的目标小于整个完全展示的操作视图,则指定所需的最小过度滚动量(overscroll)。
- targetOverscrollElasticity:拖过扩展目标时使用的弹性量。
关于这些参数更详细的用法,可以查看官方的说明文档:点击查看。
(2)下面是两种展开样式比较。一种是内置的 destructive 样式,一种是自定义样式。不过它们最终效果是一样的。
//使用内置的 destructive 样式
options.expansionStyle = .destructive(automaticallyDelete: false, timing: .after)
//使用自定义样式
options.expansionStyle = SwipeExpansionStyle(target: .edgeInset(30),
additionalTriggers: [.touchThreshold(0.8)],
elasticOverscroll: false,
completionAnimation: .fill(.manual(timing: .after)))
3,自定义扩展时按钮的行为样式
(1)通过 SwipeTableOptions 的 expansionDelegate 代理(实现 SwipeExpanding 协议),可以实现完全自定义的扩展行为。
(2)我们还可以直接使用 ScaleAndAlphaExpansion 类提供静态 default 配置(不指定的话默认就是这个),其是效果:当发生扩展行为时,多余的按钮会逐个缩小消失。
//自定义滑动过渡行为(可选)
func tableView(_ tableView: UITableView,
editActionsOptionsForRowAt indexPath: IndexPath,
for orientation: SwipeActionsOrientation) -> SwipeTableOptions {
var options = SwipeTableOptions()
options.transitionStyle = .reveal
options.expansionStyle = .selection
options.expansionDelegate = ScaleAndAlphaExpansion.default
//设置按钮区域背景色
options.backgroundColor = UIColor(red: 245/255, green: 245/255,
blue: 245/255, alpha: 1)
return options
}
(3)当然使用 ScaleAndAlphaExpansion 时也可以不用它的 default 配置,而是自己指定动画时长、缩小比例、播放间隔这些参数。
options.expansionDelegate = ScaleAndAlphaExpansion(duration: 0.5, scale: 0.2,
interButtonDelay: 0.1)
全部评论(0)