我正在开发一个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:)
但是现在桌子滚动并向上移动。
“我希望桌子不要滚动,而是移动到屏幕上的某个点,然后停止移动并开始滚动。”
处理此问题的最佳方法是什么?
干杯
答案 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
}];
试试这个让我知道结果
请在标记投票之前让我知道原因,因为这些代码正在为我工作