Как получить уведомление о начале и конце перемещения UITableViewCell? - PullRequest
30 голосов
/ 28 марта 2012

У меня в приложении для iOS есть UITableView, который периодически обновляется. Пользователь также может постоянно перемещать строки табличного представления (табличное представление всегда находится в режиме редактирования).

Я хочу остановить таймер обновления, когда пользователь начинает перетаскивать строку, и запускать его снова, когда строка отбрасывается.

Последняя часть должна быть легкой с moveRowAtIndexPath, но как получить уведомление о начале перетаскивания?

Ответы [ 4 ]

40 голосов
/ 01 июня 2012

Ваш UITableViewDelegate получит следующие уведомления в ответ на действия переупорядочения:

- (void)tableView:(UITableView *)tableView willBeginReorderingRowAtIndexPath:(NSIndexPath *)indexPath;
- (void)tableView:(UITableView *)tableView didEndReorderingRowAtIndexPath:(NSIndexPath *)indexPath;
- (void)tableView:(UITableView *)tableView didCancelReorderingRowAtIndexPath:(NSIndexPath *)indexPath;
9 голосов
/ 28 марта 2012

Я столкнулся с той же проблемой некоторое время назад и не нашел решения.В то время как я начал этот ответ с объяснения, почему это не может быть сделано, я фактически узнал, как это можно сделать!: -)

Вкратце: вы должны создать пользовательский подкласс 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).

3 голосов
/ 01 декабря 2014

Просто я нашел хак, так как яблоко уменьшит альфа, мы можем использовать это, я думаю

@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];
    }
}
0 голосов
/ 22 сентября 2014

этот метод вызывается, когда вы закончите перемещать ячейки:

- (void) tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath
...