zoukankan      html  css  js  c++  java
  • 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(@"向左滑动");
    }
  • 相关阅读:
    毕业设计:文献参考(六)
    毕业设计:文献参考(五)
    稀疏数组搜索(leetcode)
    寻找重复数(leetcode)
    联通网络的操作次数(leetcode)
    Flutter 混合开发基础
    浅谈 Serverless 开发和应用
    基于 Qt Quick Plugin 快速构建桌面端跨平台组件
    Android 设备音视频兼容性适配
    RTC 系统音频弱网对抗技术发展与实践
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/4946876.html
Copyright © 2011-2022 走看看