zoukankan      html  css  js  c++  java
  • iOS UITableView滚动头图 拉伸放大效果 (头部弹性效果) 增加iOS11支持 附有demo

    今天修改日期为2017年11月25日

    两个月前做了iOS11的bug修复,才对博客进行更新,见谅。

    在iOS11上需要注意两个问题

    1.使用UIScrollview,UITableView,UIWebView等滚动UI控件的页面造成的页面错位,会上面空白20像素(不用iPhoneX做适配情况下)

     解决:

    //防止顶端留出状态栏高度空白
        if (@available(iOS 11.0, *)) {
            _tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
        } else {
            self.automaticallyAdjustsScrollViewInsets = NO;
        }

    (2)滚动的头部内部self.iconImageView 部分 要赋值指定的大小,不能使用约束

       在iOS11上使用约束再来回拉伸头图表现水土不服的bug(具体可以描述为 拉伸过程会出现到某个位置卡顿,或者 或者整体拉伸位置错位,或者还是会出现白条)。当然你没有这个问题最好

    解决:

    #pragma mark - private
    
    - (void)configSubViews
    {
        [self addSubview:self.iconImageView];
         self.iconImageView.frame = self.frame;//这里不使用约束 iOS11以后有 拉伸时候适配bug
    //    [self.iconImageView mas_makeConstraints:^(MASConstraintMaker *make) {
    //        make.edges.equalTo(self);
    //    }];
    }

    献上demo,可以在github上给我点个星星最好 ✨

    ========华丽分割线========

    历史:

    接着上一篇来讲 头图在向下的滚动拉伸时候有一个放大的效果, 这里就讲讲具体的实现过程.

    理解起来也很简单,肯定就是监听了滚动过程,然后 判断滚动位移的相对位置是否满足,满足则需要拉伸处理.

    这里的拉伸 一般都是相对图片的等比拉伸,不能让图片比例失调.

    监听方法就是

    - (void)scrollViewDidScroll:(UIScrollView *)scrollView

    首先

    这个头图headerView 和 self.tableView的关系

    1 可以是 addSubView的关系  

    2 可以是 setTableViewHead 的关系

    区别 不大   1 适合 设计复杂 已经有了setTableViewHeaderView   2  适合经典设计 "headerView + tableView"

    (1)设置 这个headerView 高度为 ImageViewHeight 为常亮 比如 200

    (2)如果是 关系1   

    设置  self.tableView.contentInset = UIEdgeInsetsMake(ImageViewHeight, 0, 0, 0); 当 addSubView时候 正好headView在位置从0开始 高度为 ImageViewHeight 的位置.

       如果是 关系2

      直接设置  [self.tableView setTableHeaderView:headerView];

    (3)需要设置 headerImageView.contentMode = UIViewContentModeScaleAspectFill; //会保证图片比例不变,但是是填充整个ImageView的

    (4)监听处理

    /**
     *  做伸缩处理
     *
     *  @param scrollView
     */

    #pragma mark - ScrollViewDelegate

    - (void)scrollViewDidScroll:(UIScrollView *)scrollView

    {

        //HF_TITLE_NAV_HEIGHT 64  是状态栏 + 导航栏的高度

        CGFloat yOffset = scrollView.contentOffset.y + HF_TITLE_NAV_HEIGHT;

        //拉伸处理start

        if (yOffset < 0 ){

            float originHeight = ImageViewHeight;

            float resizeScale = - (scrollView.contentOffset.y + HF_TITLE_NAV_HEIGHT)/originHeight;

            float offset = - scrollView.contentOffset.y - HF_TITLE_NAV_HEIGHT;

            CGRect frame = CGRectMake(0 - (SCREEN_WIDTH * resizeScale / 2),

                                      - offset,

                                      round(SCREEN_WIDTH + SCREEN_WIDTH * resizeScale),

                                      round(originHeight + originHeight * resizeScale));

            self.headImageView.frame = frame; //这个 UIImageView是headerView的子视图,这样拉伸时候才不会顶部出现位移空白 

            headerView.frame = CGRectMake(0, 0, SCREEN_WIDTH, frame.size.height);

        }

        //end

    }

    效果:

     

  • 相关阅读:
    IntelliJ IDEA 如何在同一个窗口创建多个项目--超详细教程
    spring IOC原理
    java工作错误总结
    java跬步积累
    简单易懂设计模式——简单工厂模式
    Argo 项目入驻 CNCF,一文解析 Kubernetes 原生工作流
    电子书下载 | 超实用!阿里售后专家的 K8s 问题排查案例合集
    在生产环境中,阿里云如何构建高性能云原生容器网络?(含 PPT 下载)
    SIG Cloud Provider Alibaba 网研会第 2 期顺利召开 | 云原生生态周报 Vol. 46
    提问赠书 | 我们请了 7 位云原生专家,等你来问
  • 原文地址:https://www.cnblogs.com/someonelikeyou/p/5124742.html
Copyright © 2011-2022 走看看