拖动UITableView

时间:2013-06-01 06:25:11

标签: ios uitableview scroll

我正在开发一个iPhone应用程序,我希望将表格视图(不是单元格)拖动到屏幕中的某个点。我把桌面视图放在屏幕的下半部分,上半部分有一个图像。

当我滚动表格以查看下面的行时,表格实际上应该向上移动到图像上方(y pos减小,高度将增加)。表格将一直向上,直到它填满整个屏幕,为图像留下几个像素,并在那里停靠,从那时起,表格应该滚动。同样的行为也可以向下滚动。

这听起来有点奇怪,但这是一种新的iOS模式。

我设法使用下面的代码段完成了第一部分。

UIPanGestureRecognizer *panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanForScrollView:)];
panGestureRecognizer.maximumNumberOfTouches = 1;
panGestureRecognizer.delegate = self;
panGestureRecognizer.minimumNumberOfTouches = 1;
[self.tableView addGestureRecognizer:panGestureRecognizer];

- (void)handlePanForScrollView:(UIPanGestureRecognizer *)gesture {
    switch (gesture.state) {
        case UIGestureRecognizerStateBegan:
            break;
        case UIGestureRecognizerStateChanged: {

            CGPoint movement = [gesture translationInView:self.view];
            CGRect frame = self.tableView.frame;
            frame.origin.y += movement.y;
            if(frame.origin.y >= Y_OFFSET && frame.origin.y < self.original_frame.origin.y){
                frame.size.height -= movement.y;
                self.tableView.frame = frame;
                [gesture setTranslation:CGPointZero inView:self.view];
            }
            break;
        }
        case UIGestureRecognizerStateEnded:
        case UIGestureRecognizerStateCancelled:{
            //NSLog(@"End");
            break;
        }
        default:
            ;
            break;
    }
}

这样工作正常,桌子向上移动并停靠在Y_OFFSET下面。但正如你想象的那样,桌子不再滚动了。

所以我试过这个

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
    if(self.tableView.frame.origin.y <= Y_OFFSET ||  self.tableView.frame.origin.y >= self.original_frame.origin.y){
        NSLog(@"Here");
        return YES;
    }   
    return NO;
}

“此处”消息将在控制台上打印,但表格不会滚动。

我甚至尝试将panGestureRecognizer用于UITableView而不是我的UIPanGestureRecognizer。

self.tableView.panGestureRecognizer addTarget:self action:@selector(handlePanForScrollView:)

但是现在桌子滚动并向上移动。

“我希望桌子不要滚动,而是移动到屏幕上的某个点,然后停止移动并开始滚动。”

处理此问题的最佳方法是什么?

干杯

3 个答案:

答案 0 :(得分:2)

我认为你这样做的方式很好。您只需要停止UIGestureRecognizer在某个点之后处理任何更多的触摸。所以我要做的是(对现有代码进行最少量的更改)只是覆盖委托函数:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch

在该函数中,分析表视图的位置,如果表视图已经达到某个高度,则返回NO。这将阻止UIPanGestureRecognizer接受触摸事件并将其传递给链,这应该直接进入表视图的UIScrollView。

另外,如果我有时间想出这个,我会尝试用图像作为表的标题(self.tableView.tableHeaderView)来实现这一点。这样,所有滚动都在表的滚动视图内完成,并且表的框架不必移动。如果你想为tableHeaderView添加一些很酷的效果,你总是可以覆盖UIScrollViewDelegate函数- (void)scrollViewDidScroll:(UIScrollView *)scrollView并稍微移动标题中的图像,因为表格会向上滚动初始的半屏幕(这与Path的效果相同) )。但是,这不允许您将图像固定在表格视图的最顶部...整个图像将滚动。只需2美分。 :)

答案 1 :(得分:0)

如果我理解这个问题,最简单的解决方案是以编程方式将tableView标头设置为所需的图像。 (我认为这就像Path在设置位置时所做的那样,除了它们使用地图而不是图像。)

UIImage *image = [UIImage imageNamed:@"image_name"];
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
[self.tableView setTableHeaderView:imageView];

这相当于将带有相应图像的UIImageView拖到故事板中的tableView标题上。

请注意:表标题视图与节标题不同。有关详细信息,请参阅Documentation

答案 2 :(得分:-2)

您可以尝试使用此代码移动tableview

   [UIView animateWithDuration:1.5 animations:^
     {
         //ADD CODES HERE FOR STARTING STATE (FRAME FOR UITABLEVIEW )
        // eg: table.frame=CGRectMake(0,320,320,200);   tableview lying on bottom of viewcontroller with 200px height 


     } completion:^(BOOL finished)
     {


        // ADD CODES HERE  TO MAKE YOUR FINAL FRAME OF UITABLEVIEW
         // eg: table.frame=CGRectMake(0,0,320,200);   tableview moving to top of viewcontroller with 200px height



     }];

试试这个让我知道结果

请在标记投票之前让我知道原因,因为这些代码正在为我工​​作