Vap*_*olf 18 uitableview ios uipangesturerecognizer ios8
我想模仿滑动删除UITableViewCell的功能,就像iOS 8中的邮件应用程序一样.我不是指滑动以显示删除按钮.我指的是当你刷卡时,它会破坏3个动作,但是如果你继续向左滑动,那么电子邮件就会被删除.
在iOS 8中,UITableView有一个新方法,您可以在其中提供数据以显示任意数量的按钮:
#ifdef __IPHONE_8_0
- (NSArray *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath{
UITableViewRowAction *viewStackRowAction = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@"Stack" handler:^(UITableViewRowAction *action, NSIndexPath *indexPath) {
SM_LOG_DEBUG(@"View Stack Action");
}];
viewStackRowAction.backgroundColor = [UIColor radiusBlueColor];
UITableViewRowAction *viewUserRowAction = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@"User" handler:^(UITableViewRowAction *action, NSIndexPath *indexPath) {
SM_LOG_DEBUG(@"View User Action");
}];
viewUserRowAction.backgroundColor = [UIColor radiusLightBlueColor];
UITableViewRowAction *deleteRowAction = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@"Delete" handler:^(UITableViewRowAction *action, NSIndexPath *indexPath) {
SM_LOG_DEBUG(@"Delete");
}];
deleteRowAction.backgroundColor = [UIColor redColor];
return @[deleteRowAction, viewUserRowAction, viewStackRowAction];
}
#endif
Run Code Online (Sandbox Code Playgroud)
我没有看到任何API来检测你是否继续刷卡.我在UITableView.h中使用了8_0,上面的方法似乎是唯一的新方法.
我想可以监视滚动视图偏移,或添加/劫持UIPanGestureRecognizer.我只是想确保使用默认方式,如果有的话(并获得"免费"动画)
使用Swift 4.2和iOS 12,您可以根据需要选择以下3种方式之一,以创建尾随滑动动作,该动作将删除所选的UITableViewCell
。
UITableViewDataSource
的tableView(_:commit:forRowAt:)
当tableView(_:commit:forRowAt:)
与editingStyle
value of 一起使用时UITableViewCell.EditingStyle.delete
,系统会自动支持完全划动删除。
import UIKit
class TableViewController: UITableViewController {
var numbers = [Int](0..<10)
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return numbers.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
cell.textLabel?.text = "\(numbers[indexPath.row])"
return cell
}
override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
if (editingStyle == UITableViewCell.EditingStyle.delete) {
self.numbers.remove(at: indexPath.row)
tableView.deleteRows(at: [indexPath], with: .fade)
}
}
}
Run Code Online (Sandbox Code Playgroud)
UITableViewDelegate
的tableView(_:editActionsForRowAt:)
和UITableViewRowAction
为了支持全滑动删除与UITableViewRowAction
,你有一个初始化它style
具有的价值UITableViewRowAction.Style.destructive
。
import UIKit
class TableViewController: UITableViewController {
var numbers = [Int](0..<10)
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return numbers.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
cell.textLabel?.text = "\(numbers[indexPath.row])"
return cell
}
override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
// Intentionally blank in order to be able to use UITableViewRowActions
}
override func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {
let deleteHandler: (UITableViewRowAction, IndexPath) -> Void = { _, indexPath in
self.numbers.remove(at: indexPath.row)
tableView.deleteRows(at: [indexPath], with: .fade)
}
let deleteAction = UITableViewRowAction(style: UITableViewRowAction.Style.destructive, title: "Delete", handler: deleteHandler)
// Add more actions here if required
return [deleteAction]
}
}
Run Code Online (Sandbox Code Playgroud)
UITableViewDelegate
的tableView(_:trailingSwipeActionsConfigurationForRowAt:)
和UISwipeActionsConfiguration
(需要iOS 11)UISwipeActionsConfiguration
有一个名为的属性performsFirstActionWithFullSwipe
。performsFirstActionWithFullSwipe
具有以下声明:
var performsFirstActionWithFullSwipe: Bool { get set }
Run Code Online (Sandbox Code Playgroud)
一个布尔值,指示是否完全滑动会自动执行第一个操作。[...]将此属性设置
true
为时,在该行中进行完全轻扫会执行该actions
属性中列出的第一个操作。此属性的默认值为true
。
以下UITableViewController
实现显示了如何使用UISwipeActionsConfiguration
以管理完整划动的删除操作。
import UIKit
class TableViewController: UITableViewController {
var numbers = [Int](0..<10)
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return numbers.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
cell.textLabel?.text = "\(numbers[indexPath.row])"
return cell
}
override func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
let handler: UIContextualAction.Handler = { (action: UIContextualAction, view: UIView, completionHandler: ((Bool) -> Void)) in
self.numbers.remove(at: indexPath.row)
tableView.deleteRows(at: [indexPath], with: .fade)
completionHandler(true)
}
let deleteAction = UIContextualAction(style: UIContextualAction.Style.destructive, title: "Delete", handler: handler)
// Add more actions here if required
let configuration = UISwipeActionsConfiguration(actions: [deleteAction])
configuration.performsFirstActionWithFullSwipe = true
return configuration
}
}
Run Code Online (Sandbox Code Playgroud)
小智 2
将 ui gustere 识别器添加到每个单元格,检查“滑动”量,如果其高于特定阈值,则进行删除。
像这样的东西:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"identifier";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]];
}
UISwipeGestureRecognizer* swipe_gesture = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeLeft:)];
[swipe_gesture setDirection:UISwipeGestureRecognizerDirectionLeft];
[cell addGestureRecognizer:swipe_gesture];
return cell;
}
- (void)swipeLeft:(UIGestureRecognizer *)gestureRecognizer {
int threshold = 100;
if (sender.state == UIGestureRecognizerStateBegan)
{
startLocation = [sender locationInView:self.view];
}
else if (sender.state == UIGestureRecognizerStateEnded)
{
CGPoint stopLocation = [sender locationInView:self.view];
CGFloat dx = stopLocation.x - startLocation.x;
CGFloat dy = stopLocation.y - startLocation.y;
CGFloat distance = sqrt(dx*dx + dy*dy );
if (distance > threshold )
{
NSLog(@"DELETE_ROW");
}
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
6392 次 |
最近记录: |