桌面视图的水平滚动左右滑动手势

时间:2013-12-13 10:47:27

标签: ios objective-c

我正在尝试使用水平滚动实现uitableview。我采用了scrollview并在scrollview上添加了tableview。我设置scrollview的内容大小大于帧大小。这样它就可以水平滚动。但是当我在uitableview上添加了滑动手势时,它没有执行操作。

代码段在这里

leftswipe = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(SwipeRecognizer:)];
    leftswipe.delegate = self;
    leftswipe.direction = UISwipeGestureRecognizerDirectionLeft;

    rightswipe = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(SwipeRecognizer:)];
    rightswipe.delegate = self;
    rightswipe.direction = UISwipeGestureRecognizerDirectionRight;

- (void) SwipeRecognizer:(UISwipeGestureRecognizer *)sender
{
        if ( sender.direction == UISwipeGestureRecognizerDirectionLeft )
        {
            NSLog(@" *** SWIPE LEFT ***");
            index1++;
            self.tableHeaderLabel.text = [self.categoriesLabelArray objectAtIndex:index1];
            [self.feedsTableView reloadData];

        }
        if ( sender.direction == UISwipeGestureRecognizerDirectionRight ){
            NSLog(@" *** SWIPE RIGHT ***");
            index1--;
            self.tableHeaderLabel.text = [self.categoriesLabelArray objectAtIndex:index1];
            [self.feedsTableView reloadData];


        }
}

我想在向左或向右滑动时重新加载表格。 但是现在它没有用。

6 个答案:

答案 0 :(得分:1)

如果你在scrollView中添加tableView,你的gestureRecognizer可能会被scrollView的gestureRecognizer覆盖。

您可以尝试在

中实现代码
CGFloat lastOffset_x = 0;
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
     CGFloat currentOffSet_x = scrollView.contentOffSet.x;
     if(lastOffset_x > currentOffSet_x){
         //direction left
     }else{
         //direction right
     }
     lastOffset_x = scrollView.contentOffSet.x;
}

并自己跟踪滚动方向。

ps:记得将scrollView的contentSize调整为tableView.frame.size.width*numberOfYourTableView

答案 1 :(得分:1)

尝试添加UITableView委托方法:

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return UITableViewCellEditingStyleNone;
}

顺便说一句,您可以通过设置direction属性来实例化一个UIGestureRecognizer:

- (void)viewDidLoad
{
    [super viewDidLoad];
    UIGestureRecognizer *recognizer;
    recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeRecognizer:)];
    recognizer.direction = UISwipeGestureRecognizerDirectionRight | UISwipeGestureRecognizerDirectionLeft;
    [tableView addGestureRecognizer:recognizer];
}

答案 2 :(得分:0)

当我需要显示水平表视图时,我只使用:

-(void)setupProductsTableView {
        self.innerProductsTable.transform = CGAffineTransformMakeRotation(-M_PI_2);
        self.innerProductsTable.delegate = self;
        self.innerProductsTable.dataSource = self;
    }

如果我需要跟踪滚动,请使用:

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
        int lastVisibleCell = [[[tableView indexPathsForVisibleRows] lastObject ] row];
        //do some with last displayed cell
    }

此致 Venelin

答案 3 :(得分:0)

在SwipeRecognizer中仅编写以下代码。

- (void) SwipeRecognizer:(UISwipeGestureRecognizer *)sender
{
    if ( sender.direction == UISwipeGestureRecognizerDirectionLeft )
    {
        NSLog(@" *** SWIPE LEFT ***");
        index1++;

        [self.feedsTableView reloadData];

    }
    if ( sender.direction == UISwipeGestureRecognizerDirectionRight ){
        NSLog(@" *** SWIPE RIGHT ***");
        index1--;

        [self.feedsTableView reloadData];


    }
}

并编写tableview委托方法(对于Data),如下所示:

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
    return [self.categoriesLabelArray objectAtIndex:index1];


}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if(index1 == 0)
        //set tableCellDataArray
    if(index1 == 1)
        //set tableCellDataArray
    if(index1 == 2)
        //set tableCellDataArray
    //...
    //...
    if(index1 == n)
        //set tableCellDataArray
}

是的,不要忘记将以下内容添加到viewDidLoad方法

- (void)viewDidLoad
{
     leftswipe = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(SwipeRecognizer:)];
     leftswipe.delegate = self;
     leftswipe.direction = UISwipeGestureRecognizerDirectionLeft;

     rightswipe = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(SwipeRecognizer:)];
     rightswipe.delegate = self;
     rightswipe.direction = UISwipeGestureRecognizerDirectionRight;

     [self.feedsTableView addGestureRecognizer: leftswipe];
     [self.feedsTableView addGestureRecognizer: rightswipe];
}

答案 4 :(得分:0)

如果您的要求是在tableview中显示内容(只有1行和水平滚动),最好的方法是转换tableview。这将解决你不需要采取scrollview的所有事情。

如果要求是其他情况......请详细说明您的要求。所以我们可以有一个解决方案。

答案 5 :(得分:0)

只需使用UICollectionView

将流式布局的scrollDirection属性更改为UICollectionViewScrollDirectionHorizontal

[yourFlowLayout setScrollDirection:UICollectionViewScrollDirectionHorizontal];