zoukankan      html  css  js  c++  java
  • iOS开发之使用CALayer封装下载进度条

    效果图
    图片

    代码
     //

    //  XRProgressView.h

    //  使用CALayer封装下载进度条

    //

    //  Created by 寒竹子 on 15/6/14.

    //  Copyright (c) 2015年 寒竹子. All rights reserved.

    //

    /**

     *  下载进度条封装

     */

    #import <UIKit/UIKit.h>

    @interface XRProgressView : UIView

    @property (nonatomic, assign) CGFloat progress;

    @property (nonatomic, strong) UIColor * progressColor;

    @end


    //

    //  XRProgressView.m

    //  使用CALayer封装下载进度条

    //

    //  Created by 寒竹子 on 15/6/14.

    //  Copyright (c) 2015年 寒竹子. All rights reserved.

    //

    #import "XRProgressView.h"

    @interface XRProgressView ()

    @property (nonatomic, strong) CALayer * progressLayer; // 进度layer

    @property (nonatomic, assign) CGFloat currentWidth;    // 当前layer的width

    @end

    @implementation XRProgressView

    - (instancetype)initWithFrame:(CGRect)frame

    {

        if (self = [super initWithFrame:frame]) {

            self.layer.backgroundColor = [UIColor clearColor].CGColor;

            self.layer.borderWidth = .5f;

            

            // 创建layer

            _progressLayer = [CALayer layer];

            _progressLayer.frame = CGRectMake(0, 0, 0, self.frame.size.height);

            

            // 将progressLayer添加到当前View的layer中

            [self.layer addSublayer:_progressLayer];

            

            // 保存width

            _currentWidth = self.frame.size.width;

        }

        

        return self;

    }

    #pragma mark - getters and setters

    @synthesize progress = _progress;

    // 设置进度

    - (void)setProgress:(CGFloat)progress

    {

        _progress = progress;

        

        if (_progress < 0.0f) {

            self.progressLayer.frame = CGRectMake(0, 0, 0, self.frame.size.height);

        }else if (_progress <= 1.0f) {

            self.progressLayer.frame = CGRectMake(0, 0, _progress * self.currentWidth, self.frame.size.height);

        }else {

            self.progressLayer.frame = CGRectMake(0, 0, self.currentWidth, self.frame.size.height);

        }

    }

    - (CGFloat)progress

    {

        return _progress;

    }

    @synthesize progressColor = _progressColor;

    // 设置layer背景颜色

    - (void)setProgressColor:(UIColor *)progressColor

    {

        _progressColor = progressColor;

        self.progressLayer.backgroundColor = _progressColor.CGColor;

    }

    - (UIColor *)progressColor

    {

        return _progressColor;

    }

    @end


    //

    //  ViewController.m

    //  使用CALayer封装下载进度条

    //

    //  Created by 寒竹子 on 15/6/14.

    //  Copyright (c) 2015年 寒竹子. All rights reserved.

    //

    #define KBorder 20.0f

    #import "ViewController.h"

    #import "XRProgressView.h"

    @interface ViewController ()

    @property (nonatomic, strong) XRProgressView * progressView;

    @property (nonatomic, strong) NSTimer        * timer;

    @property (nonatomic, assign) CGFloat        progress; // 下载进度

    @end

    @implementation ViewController

    - (instancetype)init

    {

        if (self = [super init]) {

            _progress = 0.0f;

        }

        

        return self;

    }

    // 起定时器

    - (void)startTimer

    {

        _timer = [NSTimer scheduledTimerWithTimeInterval:.1f

                                                  target:self

                                                selector:@selector(updateProgress)

                                                userInfo:nil

                                                 repeats:YES];

        [[NSRunLoop currentRunLoop] addTimer:_timer forMode:NSRunLoopCommonModes];

    }

    // 模拟更新下载进度

    - (void)updateProgress

    {

        if (_progress > 1.0f) {

            _progress = 0.0f;

        }else {

            _progress += .01f;

        }

        self.progressView.progress = _progress;

    }

    - (void)viewDidLoad {

        [super viewDidLoad];

        

        self.progressView = [[XRProgressView alloc] initWithFrame:CGRectMake(KBorder, KBorder * 2.0f, self.view.frame.size.width - KBorder * 2.0f, 4.0f)];

        self.progressView.layer.masksToBounds = YES;

        self.progressView.layer.cornerRadius = self.progressView.frame.size.height / 2.0f;

        self.progressView.progressColor = [UIColor redColor];

        [self.view addSubview:self.progressView];

        

        // 开启定时器

        [self startTimer];

    }

    - (void)didReceiveMemoryWarning {

        [super didReceiveMemoryWarning];

    }

    @end

     
  • 相关阅读:
    【Html】Clipboard.js 实现点击复制,剪切板操作
    【转】【Python】python使用urlopen/urlretrieve下载文件时出现403 forbidden的解决方法
    【Html】div 加载 html页面的方法
    【WPF】创建文本字符串的路径PathGeometry
    【WPF】自定义鼠标样式
    Linux 错误记录
    微信开放平台代公众号管理
    微信开放平台获取授权公众号的流程
    vue-router "path" is required in a route configuration
    最大连接数“65535”的误解
  • 原文地址:https://www.cnblogs.com/hanzhuzi/p/4594039.html
Copyright © 2011-2022 走看看