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

时间:2012-02-21 09:20:29

标签: iphone ios cocoa-touch ipad uiscrollview

我想创建一个UITableViewUIScrollView的子类,当内容偏移量为>时,它会在顶部有一些阴影。 0表示内容可滚动。 (见附图) enter image description here

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

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

我面临的挑战是,我无法弄清楚tableView如何在可滚动内容之上添加固定内容。

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

有什么想法吗?

谢谢!

4 个答案:

答案 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;
    }
}

}