是否可以将固定内容添加到UIScrollView?

我想创建一个UITableViewUIScrollView的子类,当内容偏移量> 0时,顶部会有一些阴影,表示内容是可滚动的。 (见附图) 在此处输入图像描述

我现在实现它的方式是使用UIViewController ,它是tableView的委托。 我只是在tableView顶部有一个GradientView ,我拦截了scrollViewDidScroll:来为该顶部渐变的可见性设置动画。

我的这个实现的问题是它不是“干净”。 我希望我的UIViewControllers能够处理逻辑,而不是应用渐变和东西。 我希望我可以删除一个UITableView的子类,它将为我做这件事。

对我来说,挑战在于我无法弄清楚tableView如何在可滚动内容之上添加固定内容。

另一个问题是我应该覆盖什么方法的UIScrollView来拦截滚动事件。 显然我不希望tableView成为自己的代表……

有任何想法吗?

谢谢!

好的,所以我在Apple的WWDC 2011 Session 104video – 高级滚动视图技术上找到了解决方案。

此video中有一节关于滚动视图中的“固定视图”。 根据Apple的说法,这里的方法是覆盖layoutSubviews并将所有代码放在任何你想要的位置 – 无论你想要什么。

我尝试了它,它实际上非常简单,它按预期工作。

因此,例如,如果我想在滚动内容时在表顶部使用阴影标题,那么这就是我应该编写的代码:

 -(void) layoutSubviews { [super layoutSubviews]; [self positionTopShadow]; } -(void) positionTopShadow { CGFloat yOffset = self.contentOffset.y; // I'm doing some limiting so that the maximum height of the shadow view will be 40 pixels yOffset = MIN(yOffset, 40); yOffset = MAX(0, yOffset); CGRect frame = self.topShadowView.frame; // The origin should be exactly like the content offset so it would look like // the shadow is at the top of the table (when it's actually just part of the content) frame.origin = CGPointMake(0, self.contentOffset.y); frame.size.height = yOffset; frame.size.width = self.frame.size.width; self.topShadowView.frame = frame; if (self.topShadowView.superview == nil) { [self addSubview:self.topShadowView]; } [self bringSubviewToFront:self.topShadowView]; } 

我已经设法找到了一个更简单的方法来做到这一点,然后是亚伯拉罕所做的。

我使用的事实是UIScrollView调用scrollViewDidScroll:滚动更改的像素,以将对象设置在偏移的位置。 下面是我的完整代码,当你四处移动时,在滚动视图的顶部保持一个灰色条:

 - (void)viewDidLoad { UIScrollView* scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(5.0, 50.0, self.bounds.size.width - 15.0, self.bounds.size.height - 60.0)]; [scrollView setBackgroundColor:[UIColor colorWithRed:251.0/255.0 green:251.0/255.0 blue:251.0/255.0 alpha:1.0]]; [scrollView setContentSize:CGSizeMake(scrollView.frame.size.width + 500, 1000.0)]; [scrollView setDelegate:self]; [self addSubview:scrollView]; UIView* header = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, scrollView.contentSize.width, 40.0)]; [header setTag:100]; [header setBackgroundColor:[UIColor darkGrayColor]]; [scrollView addSubview:header]; } -(void)scrollViewDidScroll:(UIScrollView *)scrollView { UIView* header = [self viewWithTag:100]; [header setFrame:CGRectMake(0.0, scrollView.contentOffset.y, header.bounds.size.width, header.bounds.size.height)]; } 

您可以尝试使用tableView的viewForHeaderInSection方法作为着色视图(以及heightForHeaderInSection)…将阴影部分作为标题。这样在可滚动内容之上有固定内容。

 #define kImageOriginHight 300 - (void)scrollViewDidScroll:(UIScrollView *)scrollView1{ CGFloat yOffset = scrollView1.contentOffset.y; // NSLog(@" y offset := %f", yOffset); //zoom images and hide upper view while scrooling to down position if (yOffset < 0) {//-kImageOriginHight CGRect f = imgV.frame; f.origin.y = yOffset; f.size.height = -yOffset + kImageOriginHight; imgV.frame = f; //viewTableUpperView.alpha = 1.5 - (yOffset/-kImageOriginHight); //viewTableUpperView.userInteractionEnabled = NO; if(yOffset+0.5 == -kImageOriginHight){ [UIView animateWithDuration:0.1 animations:^{ //viewTableUpperView.alpha = 1.0; }]; //viewTableUpperView.userInteractionEnabled = YES; } } 

}