Swift语言实现下拉变大效果:(上拉缩小效果随后研究......)

关键代码:方法一:

self.automaticallyAdjustsScrollViewInsets = false;
        
        tableViewW = UITableView.init(frame: CGRectMake(0, 0, screenWidth(), screenHeight()), style: .Plain);
        tableViewW.delegate = self;
        tableViewW.dataSource = self;
        tableViewW.showsVerticalScrollIndicator = false;
        tableViewW.tableFooterView = UIView.init();
        //下面两句话是关键点,并且顺序不能错,否则初始化运行的时候图片显示不完全
        tableViewW.contentInset = UIEdgeInsetsMake(200, 0, 0, 0);
        tableViewW.contentOffset = CGPointMake(0, -200);
        if tableViewW.respondsToSelector(Selector("setLayoutMargins:"))
        {
            tableViewW.layoutMargins = UIEdgeInsetsZero;
        }
        if tableViewW.respondsToSelector(Selector("setSeparatorInset:"))
        {
            tableViewW.separatorInset = UIEdgeInsetsZero;
        }
        self.view.addSubview(tableViewW);
        
        headView = UIImageView.init(frame: CGRectMake(0, -200, screenWidth(), 200));
        headView.image = UIImage.init(named: "33.jpg");
        //这句话是关键点设置高度改变宽度也改变
        headView.contentMode = UIViewContentMode.ScaleAspectFill;
        tableViewW.addSubview(headView);

实现UIScrollView的代理方法:

func scrollViewDidScroll(scrollView: UIScrollView) {
        let offSetY:CGFloat = scrollView.contentOffset.y;//当这里有导航条的时候:+NavigationBarHeight
        if offSetY < -200
        {
            //下拉,图片放大
            var frameE:CGRect = headView.frame;
            frameE.origin.y = offSetY;
            frameE.size.height = -offSetY;//contentMode = UIViewContentModeScaleAspectFill;时,高度改变宽度也改变
            headView.frame = frameE;
            
        }

OC语言运用第二种方法实现,图片的下拉放大,下拉缩小的效果

关键代码:

self.title = @"下拉变大,上拉缩小";
    self.automaticallyAdjustsScrollViewInsets = NO;
    
    _myTableView = [[UITableView alloc]initWithFrame:CGRectMake(0, navHeight, screenWidth, screenHeight - navHeight)];
    _myTableView.delegate = self;
    _myTableView.dataSource = self;
    _myTableView.contentInset = UIEdgeInsetsMake(headViewRect.size.height-navHeight-navHeight, 0, 0, 0);
    [self.view addSubview:_myTableView];
    
    _myView = [[HeadView alloc]initWithFrame:headViewRect backgroundView:@"22.jpg" headView:@"sun.png" headViewWidth:(CGFloat)(screenWidth / 4) signLabel:@"用户名:太阳*黑子"];
    _myView.backgroundColor = [UIColor clearColor];
    _myView.userInteractionEnabled = NO;
    [self.view addSubview:_myView];
    
    UIButton *backBtn = [UIButton buttonWithType:UIButtonTypeCustom];
    backBtn.frame = CGRectMake(20, 20, 60, 44);
    [backBtn setTitle:@"<<返回" forState:UIControlStateNormal];
    [backBtn setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
    [backBtn addTarget:self action:@selector(backBtnClick) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:backBtn];

实现UIScrollView的方法:

#pragma mark ------- UIScrollViewDelegate
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
    
    CGFloat offset_Y = scrollView.contentOffset.y + headViewRect.size.height-navHeight-navHeight;
    
    if  (offset_Y < 0) {
        //下拉图片放大
        _myView.backgroundView.contentMode = UIViewContentModeScaleToFill;
        
        _myView.backgroundView.frame = CGRectMake(offset_Y*0.5 , -navHeight, screenWidth - offset_Y, headViewRect.size.height - offset_Y);
    }else if (offset_Y > 0 && offset_Y <= (headViewRect.size.height-navHeight-navHeight)) {
        //下拉图片缩小,并改变图片的显示效果
        _myView.backgroundView.contentMode = UIViewContentModeTop;
        
        _myView.backgroundView.frame = CGRectMake(0 ,navHeight* offset_Y/(headViewRect.size.height-navHeight-navHeight)-navHeight , screenWidth , headViewRect.size.height -(navHeight + navHeight* offset_Y/(headViewRect.size.height-navHeight-navHeight)-navHeight) - offset_Y);
        
        
        CGFloat width = offset_Y*(40-(screenWidth / 4))/(headViewRect.size.height-navHeight-navHeight)+(screenWidth / 4);
        _myView.headView.frame =CGRectMake(0, 0, width,width);
        _myView.headView.layer.cornerRadius =width*0.5;
        _myView.headView.center = _myView.backgroundView.center;
        
        _myView.signLabel.frame =CGRectMake(0, CGRectGetMaxY(_myView.headView.frame), screenWidth, 40);
        
        _myView.signLabel.alpha = 1 - (offset_Y*3 / (headViewRect.size.height-navHeight-navHeight) /2);
    }
}

效果图:

     

Demo下载:http://download.csdn.net/detail/hbblzjy/9606681


Swift基础之实现下拉变大和OC下拉变大上拉缩小Demo的更多相关文章

  1. 向上滚动或者向下滚动分页异步加载数据(Ajax + lazyload)[上拉加载组件]

    /**** desc : 分页异步获取列表数据,页面向上滚动时候加载前面页码,向下滚动时加载后面页码 ajaxdata_url ajax异步的URL 如data.php page_val_name a ...

  2. RecyclerViewLoadMoreDemo【封装上拉加载功能的RecyclerView,搭配SwipeRefreshLayout实现下拉刷新】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 封装含有上拉加载功能的RecyclerView,然后搭配SwipeRefreshLayout实现下拉刷新.上拉加载功能. 在项目中将 ...

  3. Android下拉刷新上拉载入控件,对全部View通用!

    转载请声明出处http://blog.csdn.net/zhongkejingwang/article/details/38868463 前面写过一篇关于下拉刷新控件的博客下拉刷新控件终结者:Pull ...

  4. 用mescroll实现无限上拉增加数据,下拉刷新数据 (学习笔记)

    最近自己做一个web app需要用到上拉查询下页数据,网上看了很多很多帖子,发现并不能快速的套用,总是会出现各种问题无法使用,于是无奈自己跑去看了官方api文档,终于做了出来,至此做个笔记,以后用到可 ...

  5. 微信小程序 下拉刷新 上拉加载

    1.下拉刷新  小程序页面集成了下拉功能,并提供了接口,我们只需要一些配置就可以拿到事件的回调. 1. 需要在 .json 文件中配置. 如果配置在app.json文件中,那么整个程序都可以下拉刷新. ...

  6. MUI - 上拉刷新/下拉加载

    新闻信息列表必备的功能,支持Table,Ul等列表. 以下是DIV版本,在安卓端或者ios端必须使用双webview模式,传送门:http://dev.dcloud.net.cn/mui/pulldo ...

  7. Android PullToRefresh (GridView 下拉刷新上拉加载)

    做这个需要自己去git hub上下载个pull-to-refresh 里面有个library为依赖包自己导到自己的项目中 (下载地址:https://github.com/chrisbanes/And ...

  8. pullToRefresh下拉刷新上拉加载

    PullToRefresh 是一个第三方的工程. 之前的自定义下拉刷新控件貌似不太好用,于是网上找了这个. 参考:http://www.cnblogs.com/summers/p/4343964.ht ...

  9. Android PullToRefreshListView上拉刷新和下拉刷新

    PullToRefreshListView实现上拉和下拉刷新有两个步骤: 1.设置刷新方式 pullToRefreshView.setMode(PullToRefreshBase.Mode.BOTH) ...

随机推荐

  1. 读书笔记-《Maven实战》-2018/4/17

    第五章 坐标和依赖 1.如同笛卡尔坐标系一样,Maven也通过坐标三元素定位一个资源. <groupId>com.dengchengchao.test</groupId> &l ...

  2. JButton

    JButton和Button区别: Button是在java.awt.*中的,而JButton是在javax.swing.*中,swing是awt的一个扩展,由纯java便携,它有一个与平台无关的实现 ...

  3. Servlet生命周期与工作原理(转载)

    Servlet生命周期分为三个阶段: 1,初始化阶段  调用init()方法 2,响应客户请求阶段 调用service()方法 3,终止阶段 调用destroy()方法 Servlet初始化阶段: 在 ...

  4. 分享一个二维码图片识别控制台程序Demo

    怎么用NuGet和配置log4net就不介绍了,直接上代码(QRDecodeDemo.zip). (Visual Studio 2015 下的项目,用的.NET Framework 4.5.2) 吐槽 ...

  5. Answers to "Why are my jobs not running?"

    from :https://community.oracle.com/thread/648581 This is one of the most common Scheduler questions ...

  6. JavaScript原型与原型链

    一.数据类型 JavaScript的数据类型可以分为基本数据类型和引用数据类型. 基本数据类型(6种) String Number Boolean null undefined Symbol(ES6) ...

  7. LintCode题解之斐波纳契数列

    直接使用递归的方法会导致TLE,加个缓存就好了: public class Solution { private Integer[] buff = new Integer[1000]; /* * @p ...

  8. 谈谈Circuit Breaker在.NET Core中的简单应用

    前言 由于微服务的盛行,不少公司都将原来细粒度比较大的服务拆分成多个小的服务,让每个小服务做好自己的事即可. 经过拆分之后,就避免不了服务之间的相互调用问题!如果调用没有处理好,就有可能造成整个系统的 ...

  9. Node.js Buffer(缓冲区)

    JavaScript 语言自身只有字符串数据类型,没有二进制数据类型. 但在处理像TCP流或文件流时,必须使用到二进制数据.因此在 Node.js中,定义了一个 Buffer 类,该类用来创建一个专门 ...

  10. MyEclipse的Debug模式启动缓慢

    打开breakpoints veiw,右键-> Remove all,重启下服务器就OK了 -–下面有个"顶"字,你懂得O(∩_∩)O哈哈~ -–乐于分享,共同进步! -–更 ...