模仿淘宝商品详情的上滑图片错位效果

QQ20170823-171633.gif

产品前几天提了一个需求,模仿淘宝商品详情的部分效果。

往上拉动的时候图片有一点下移的,并不是完全随着向上移动。头部的导航随着滑动改变透明度。点击商品按钮回到初始状态,点击详情按钮跳到详情部分。

商品图片显示我用的SDCycleScrollView。但是有些功能需要自己添加,所以我自己新建个继承了SDCycleScrollView类。右下角的图片页码,和下拉的时候图片会放大。

我整个页面使用xib布局的,所以要改变状态就只能把需要变化的约束连线出来就可以了。
使用KVO监听scrollview的偏移量来改变状态。

  [self.scrollContentView addObserver:self forKeyPath:@"contentOffset"
                                options:NSKeyValueObservingOptionOld|NSKeyValueObservingOptionNew
                                context:nil];

视图消失的时候一定要记得释放

    [self.scrollContentView removeObserver:self
                                forKeyPath:@"contentOffset"];

监听,改变需要的状态

#pragma mark - KVO
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context{
    
    if ([object isEqual:self.scrollContentView] && [keyPath isEqualToString:@"contentOffset"]) {
        [self refreshNavigationBar];
    }
}

主要就是这些计算需要根据你的实际需求来,其他的没什么要注意的!

#pragma mark NavigationBar
- (void)refreshNavigationBar {
    
    CGPoint offset = self.scrollContentView.contentOffset;
    NSLog(@"%@",NSStringFromCGPoint(offset));
    CGFloat offsetY = offset.y;
    if (offset.y < 0) {
       
        //下拉放大图片
        self.imgIconTop.constant    = offsetY; //图片顶部的约束
        self.imgIconHeight.constant = -offsetY+UIScreenWidth;//图片高
        self.imgIconWidth.constant  = -offsetY+UIScreenWidth;//图片宽
        [self.scrollContentView layoutIfNeeded]; //跟新约束
        [self.cycleView scrollToItemAtIndex:self.currentIndex]; //修改图片位置使其在屏幕中间
        
    } else {
        
        //通过offset.y与 图片高度 减去自定义头部高度再减去图片下标的偏移量 比例来决定透明度
        CGFloat alpha = MIN(1, fabs(offsetY/(AlphaOffSet - offsetY)));
        self.customNavView.alpha = alpha;
        //偏移量超过一定程度就不用改变 否则影响整体滑动,如果不存在商品详情也停止滑动
        if (offsetY <= DetailOffSet - self.detailOffsetY && _webView.hidden == NO) {
            self.imgIconBottom.constant = -offsetY;//图片的底部约束,
            self.cycleView.pageNumberLabelOffset = offsetY;//右下角页面的位置更新
        }
        
        //更新下划线的位置
        if (offsetY >= DetailOffSet - self.detailOffsetY) {
            [self.customNavView selectDetailButton];
        } else {
            [self.customNavView selectGoodsButton];
        }
    }
}

demo https://github.com/TheCodeor/GoodsDetailDemo
这些东西开始一听好像很麻烦,但是想明白代理了也没啥!有问题了可以在评论里问!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,687评论 25 708
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,261评论 4 61
  • 几乎每个人,都曾有过一段或多段无疾而终的爱情,有的如同烟花般璀璨绽放之后就黯然失色,有的历经千辛万苦却最终也没能修...
    芸羲阅读 696评论 14 10
  • 我停下来盯着那里。 一堆人挤在一个狭窄的过道中间,好像在为一样东西争的头破血流。我靠着墙饶有兴致的看着,我正是一个...
    夜行不锦衣阅读 312评论 2 2
  • 2/21 笑来老师《财富自由之路》,前言及1.你知道自己的未来是什么样子的吗? ——你是否笃信你能变成更好的你? ...
    医路洁行阅读 290评论 3 2