我的iOS应用中有一个UITableView会定期刷新。用户还可以随时移动tableview行(tableview始终处于编辑模式)。
我想在用户开始拖动行时停止刷新计时器,并在删除行时再次启动它。
使用moveRowAtIndexPath
,最后一部分应该很简单,但如何获得有关拖动开始的通知?
答案 0 :(得分:40)
您的UITableViewDelegate将收到以下通知以响应重新排序操作:
- (void)tableView:(UITableView *)tableView willBeginReorderingRowAtIndexPath:(NSIndexPath *)indexPath;
- (void)tableView:(UITableView *)tableView didEndReorderingRowAtIndexPath:(NSIndexPath *)indexPath;
- (void)tableView:(UITableView *)tableView didCancelReorderingRowAtIndexPath:(NSIndexPath *)indexPath;
答案 1 :(得分:9)
前段时间我遇到了同样的问题但没找到解决办法。虽然我开始回答并解释为什么不能这样做,但我实际上发现了它是如何完成的! : - )
简而言之:您必须创建UITableViewCell
的自定义子类。覆盖layoutSubviews
以将UILongPressGestureRecognizer
附加到UITableViewCellReorderControl
。定义协议并使用委托来通知您想要拖动状态的任何人。
CustomTableViewCell.h:
#import <UIKit/UIKit.h>
@protocol CustomTableViewCellDelegate;
@interface CustomTableViewCell : UITableViewCell {
}
@property (nonatomic, assign) id <CustomTableViewCellDelegate> delegate;
@end
@protocol CustomTableViewCellDelegate
- (void)CustomTableViewCell:(CustomTableViewCell *)cell isDragging:(BOOL)value;
@end
CustomTableViewCell.m:
#import "CustomTableViewCell.h"
@implementation CustomTableViewCell
@synthesize delegate = _delegate;
- (void)handleGesture:(UIGestureRecognizer *)gestureRecognizer {
if (gestureRecognizer.state == UIGestureRecognizerStateBegan) {
[_delegate CustomTableViewCell:self isDragging:YES]; // Dragging started
} else if (gestureRecognizer.state == UIGestureRecognizerStateEnded) {
[_delegate CustomTableViewCell:self isDragging:NO]; // Dragging ended
}
}
- (void)layoutSubviews {
[super layoutSubviews];
for (UIView *view in self.subviews) {
if ([NSStringFromClass ([view class]) rangeOfString:@"ReorderControl"].location != NSNotFound) { // UITableViewCellReorderControl
if (view.gestureRecognizers.count == 0) {
UILongPressGestureRecognizer *gesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)];
gesture.cancelsTouchesInView = NO;
gesture.minimumPressDuration = 0.150;
[view addGestureRecognizer:gesture];
}
}
}
}
@end
请注意,虽然此代码不使用任何私有API,但如果Apple更改其内部实现(即更改UITableViewCellReorderControl
的类名),它仍可能停止工作。
答案 2 :(得分:3)
我发现了一个黑客,因为苹果会减少alpha,我猜可以使用
@interface CustomTableViewCell ()
@property (nonatomic, assign) BOOL isDragging;
@end
-(void)draggingWillBegan
{
//use a delegate method to inform tableview
}
-(void)draggingDidEnd
{
//use a delegate method to inform tableview
}
- (void)layoutSubviews
{
[super layoutSubviews];
//Since apple wont provide en
if(self.alpha <= 0.95 && !self.isDragging){
self.isDragging = YES;
[self draggingWillBegan];
}
if(self.alpha >= 0.95 && self.isDragging){
self.isDragging = NO;
[self draggingDidEnd];
}
}
答案 3 :(得分:0)
当您完成移动单元格时,会调用此方法:
- (void) tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath