iOS之UITableViewCell左右滑动效果

首先在 UITableViewCell.h 中声明一个代理

@protocol UITableViewCellSlideDelegate <UITableViewDelegate>

@optional
- (void)tableView:(UITableView *)tableView slideToRightWithIndexPath:(NSIndexPath *)indexPath;
- (void)tableView:(UITableView *)tableView slideToLeftWithIndexPath:(NSIndexPath *)indexPath;
@end

然后在 UITableViewCell.m 中 创建一个手势 UIPanGestureRecognizer,因为我们左右滑动的时候必须依赖拖动手势,然后在 UIPanGestureRecognizer 的代理方法中进行判断到底是左滑还是右滑

static const CGFloat kSlideWidth = 80;
static const CGFloat kSlideWidthDelta = 0.08;

#pragma mark - UIGestureRecognizerDelegate
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
    if (self.panGestureRecognizer == gestureRecognizer) {
        CGPoint point = [self.panGestureRecognizer translationInView:self];
        return fabs(point.x) > fabs(point.y);
    } else {
        return NO;
    }
}

#pragma mark - Event Handler
- (void)panGestureRecognizerHandler:(UIPanGestureRecognizer *)gestureRecognizer
{
    switch (gestureRecognizer.state) {
        case UIGestureRecognizerStateChanged: {
            CGPoint point = [gestureRecognizer translationInView:self];
            CGFloat offset = point.x;
            if (offset >= kSlideWidth) {

                offset = kSlideWidth + (offset - kSlideWidth) * kSlideWidthDelta;

                if (_parent.delegate && [_parent.delegate respondsToSelector:@selector(tableView:slideToRightWithIndexPath:)]) {

                    id<UITableViewCellSlideDelegate> delgate = (id<UITableViewCellSlideDelegate>)_parent.delegate;
                    [delgate tableView:_parent slideToRightWithIndexPath:_indexPath];

                }

            } else if (offset <= -kSlideWidth) {

                offset = -kSlideWidth + (offset + kSlideWidth) * kSlideWidthDelta;

                if (_parent.delegate && [_parent.delegate respondsToSelector:@selector(tableView:slideToLeftWithIndexPath:)]) {
                    id<UITableViewCellSlideDelegate> delgate = (id<UITableViewCellSlideDelegate>)_parent.delegate;
                    [delgate tableView:_parent slideToLeftWithIndexPath:_indexPath];

                }

            }
            self.contentView.center = CGPointMake(self.center.x + offset,
                                                  self.contentView.center.y);
            break;
        }
        default:
            break;
    }
}

最后就可以在外部调用代理方法进行相关的操作了

#pragma mark - UITableViewCellSlideDelegate
- (void)tableView:(UITableView *)tableView slideToRightWithIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"向右滑动");
}

- (void)tableView:(UITableView *)tableView slideToLeftWithIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"向左滑动");
}
posted @ 2015-11-08 09:32  brave-sailor  阅读(2094)  评论(0编辑  收藏  举报