我想创建一个UITableView
或UIScrollView
的子类,当内容偏移量为>时,它会在顶部有一些阴影。 0表示内容可滚动。 (见附图)
我现在实现它的方式是使用UIViewController
的委托tableView
。我只是在GradientView
的顶部有一个tableView
,我拦截了scrollViewDidScroll:
来设置该顶部渐变的可见性。
我对这个实现的问题是它不是“干净”。我希望我的UIViewControllers
能够处理逻辑,而不是处理应用渐变和东西。我希望我可以删除UITableView
的子类来为我做这件事。
我面临的挑战是,我无法弄清楚tableView
如何在可滚动内容之上添加固定内容。
另一个问题是我应该覆盖UIScrollView
的哪些方法来拦截滚动事件。显然我不希望tableView成为自己的代表...
有什么想法吗?
谢谢!
答案 0 :(得分:29)
好的,所以我在Apple的WWDC 2011 Session 104视频 - 高级滚动视图技术上找到了解决方案。
此视频中有一节关于滚动视图中的“固定视图”。 根据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];
}
答案 1 :(得分:3)
我已经设法找到了一个更简单的方法来做到这一点,然后是Avraham所做的。
我使用的事实是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)];
}
答案 2 :(得分:0)
你可以尝试使用tableView的viewForHeaderInSection方法作为着色视图(以及heightForHeaderInSection)...将阴影部分作为标题。这样在可滚动内容之上有一个固定的内容。
答案 3 :(得分:0)
#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;
}
}
}