iOS开发中headerView Parallax的实现方法

首先上效果图

iOS开发中headerView Parallax的实现方法_第1张图片

改自这个库的代码,主要是为了实现上图中tableHeaderView的视差效果

关键代码如下:

- (void)initialSetupForCustomSubView:(UIView *)subView
{
    //初始化中间层imageScrollView
    UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:self.bounds];
    self.imageScrollView = scrollView;
   
    //设置内容层的自动布局并存储
    subView.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
    self.subView = subView;
   
    //将内容层View添加到scrollView上
    [self.imageScrollView addSubview:subView];
    [self addSubview:self.imageScrollView];
}

- (void)layoutHeaderViewForScrollViewOffset:(CGPoint)offset
{
    CGRect frame = self.imageScrollView.frame;
   
    if (offset.y > 0)
    {
        frame.origin.y = MAX(offset.y *kParallaxDeltaFactor, 0);
        self.imageScrollView.frame = frame;
        self.clipsToBounds = YES;
    }
    else
    {
        CGFloat delta = 0.0f;
        CGRect rect = kDefaultHeaderFrame;
        delta = fabs(MIN(0.0f, offset.y));
        rect.origin.y -= delta;
        rect.size.height += delta;
        self.imageScrollView.frame = rect;
        self.clipsToBounds = NO;
    }
}

第一个函数将传入的subview添加到scrollView上并做了响应的配置

这里说一下第二个函数,第一,如果你Embedded了NavigationController的话,初始位置的offset.y = -64
由此进入else语句中,kDefaultHeaderFrame默认起点是(0,0),size是你自定义View的frame的size
fabs是取绝对值
初始状态下rect的起点向上提64个单位到达屏幕的左上顶点
然后自己再加长64个单位
clipsToBounds设置为NO是为了避免你的imageScrollView的上部被你的自定义View的边界给截了
以上是刚开始的情况

如果你向下拉 offset.y仍取负值,仍然进入下面的代码块中,前四行代码的实际作用就是让rect.origin.y始终等于offset.y,也就是始终在屏幕左上角,然后你比起初始状态多下拉多少,就多加长多少,就这样

接下来是重点,如果你下拉的时候设置了imageView.contentMode = scaleAspectFill 的话,如果scrollView的高度未达到image的高度,图片内容的下移速度是ContentOffSet.y下移速度的0.5倍,如果超过image的高度,图片内容就会按高度放大
向上划,但offset.y还是小于零的时候,图片内容的上移速度仍然是ContentOffSet.y上移速度的0.5倍,具体为什么,现在还不清楚,会继续研究.. 

但当offSet.y大于零的时候,就会进入第一个代码块中,clipToBounds设置为YES是为了避免与下面的tableCell冲突,重点在第一句,他设置了frame.orgin.y 为0.5倍的offset.y,也就是说,ContentOffset.y每增加一个单位,这个scrollView只增加半个单位,也就是图片内容的“上移”速度要慢一半(其实都是下移,下移的慢一半看起来就像上移)
因为scrollView的size没变,所以到这个位置(offSet.y > 0)之后图片的contentMode就没什么卵用了,但为了保持和之前一样的Parallax效果,也就是0.5倍移速的效果,这里设置为0.5,动画效果就会很顺滑,如果这个地方你把0.5改为1,就会发现,当你划到offset.y大于零之后,图就不动了,你要设置为1.5,图还会反过来往下走,因为图的offset.y往下增加的快呗

这段代码出现在自定义的HeaderView中,最后将它设置成headerView即可
要实现Parallax效果你需要在你自己的scrollViewDidScroll函数里面调用上面那个函数,把contentOffSet传进来

比如:(这段是Swift)

    override func  scrollViewDidScroll(scrollView: UIScrollView) {
        let header: ParallaxHeaderView = self.tableView.tableHeaderView as! ParallaxHeaderView
        header.layoutHeaderViewForScrollViewOffset(scrollView.contentOffset)
       
    }

如果需要参考代码的话: https://github.com/Vinodh-G/ParallaxTableViewHeader

既然发布不到首页没什么人看了,那我怎么舒服怎么写好了ヽ(・∀・)ノ


你可能感兴趣的:(ios,UI,Parallax)