拖动UITableView

我正在一个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:) 

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

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

处理这个问题的最好方法是什么?

干杯

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

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

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

另外,如果我有时间弄清楚这一点,我会尽量做到这一点与图像的表头(self.tableView.tableHeaderView)。 这样,所有的滚动都在表格的滚动视图内完成,表格的框架不必移动。 如果你想添加一些很酷的效果tableHeaderView,你总是可以重写UIScrollViewDelegate函数- (void)scrollViewDidScroll:(UIScrollView *)scrollView并稍微移动标题中的图像,当表格向上滚动的初始半屏幕(这是Path的作用相同)。 但是,这不会允许您在表格视图的最上方固定图像…整个图像将滚动。 只是我2美分。 🙂

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

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

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

请注意:表头视图与节头不同。 请参阅文档了解更多信息。

你可以尝试这个代码移动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 }]; 

试试这个让我知道结果

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