IOS 自定义控件之UIActivityIndicatorView

原创blog,转载请注明出处

blog.csdn.net/hello_hwc

前言

这个系列的本身不是为了写一些东西让读者拿过去就直接可以用的。过段时间我会在github上传一些拿去就可以用的。这个系列的本身是希望抛砖引玉,提供一些自定义控件的思路。

本文的内容

  • 阐述了实现自定义UIActivityIndicator的过程

希望通过本文,读者能够学会

  • CAShapeLayer的简单使用
  • CAGradientLayer的简单使用
  • 自定义控件的一些思路

    一 demo效果

二 实现的过程

  1. 用_shapeLayer定义环形路径
_shapeLayer = [CAShapeLayer layer];
        _shapeLayer.bounds = CGRectMake(0, 0, 100,100);
        _shapeLayer.position = CGPointMake(50,50);
        _shapeLayer.strokeColor = [UIColor blueColor].CGColor;
        _shapeLayer.fillColor = [UIColor clearColor].CGColor;
        CGMutablePathRef path = CGPathCreateMutable();
        _shapeLayer.lineWidth = 5.0;
//        _shapeLayer.backgroundColor = [UIColor purpleColor].CGColor;
        CGPathAddArc(path, nil,50, 50,45,0,2*M_PI,YES);
        _shapeLayer.path = path;

2 用CAGradientLayer定义渐变,用上文的环形路径去截取。

 _indicatorLayer = [[CAGradientLayer alloc] init];
        _indicatorLayer.bounds = CGRectMake(0, 0, 100,100);
        _indicatorLayer.position = CGPointMake(50,50);
        _indicatorLayer.colors = @[(id)[UIColor blueColor].CGColor,
                                   (id)[UIColor greenColor].CGColor,
                                   (id)[UIColor blueColor].CGColor];
        _indicatorLayer.locations  = @[@(0.25), @(0.5), @(0.75)];
        _indicatorLayer.startPoint = CGPointMake(0.0, 0.0);
        _indicatorLayer.endPoint = CGPointMake(1.0,1.0);
        _indicatorLayer.masksToBounds = YES;
        [_indicatorLayer setMask:self.shapeLayer];//截取

3 在Start函数中开始动画,stop结束动画

-(void)start{
    self.hidden = NO;
    [UIView animateWithDuration:1.0
                          delay:0.0
                        options:UIViewAnimationOptionRepeat | UIViewAnimationOptionCurveLinear
                        animations:^{
                            self.transform = CGAffineTransformMakeRotation(M_PI);
                        } completion:^(BOOL finished) {

                        }];
}
-(void)stop{
    [self.indicatorLayer removeAllAnimations];
    self.hidden = YES;
}

4 使用

- (IBAction)start:(id)sender {
    [self.spinner start];
}
- (IBAction)stop:(id)sender {
    [self.spinner stop];
}

- (void)viewDidLoad {
    [super viewDidLoad];    

    self.spinner = [[WCActivityIndicicator alloc] init];
    self.spinner.bounds = CGRectMake(0, 0, 100,100);
    self.spinner.center = self.view.center;
    [self.view addSubview:self.spinner];
    // Do any additional setup after loading the view, typically from a nib.
}


最后,附上完整的demo代码,不要直接拿去用,很多地方我没有完善的,仅供学习使用。

WCActivityIndicicator.h

//
//  WCActivityIndicicator.h
//  WCActivityindicator
//
//  Created by huangwenchen on 15/2/17.
//  Copyright (c) 2015年 huangwenchen. All rights reserved.
//

#import <UIKit/UIKit.h>
#import <QuartzCore/QuartzCore.h>
@interface WCActivityIndicicator : UIView
@property (strong,nonatomic) UIColor * color;
-(instancetype)init;
-(void)start;
-(void)stop;
@end

WCActivityIndicicator.m

//
//  WCActivityIndicicator.m
//  WCActivityindicator
//
//  Created by huangwenchen on 15/2/17.
//  Copyright (c) 2015年 huangwenchen. All rights reserved.
//

#import "WCActivityIndicicator.h"

@interface WCActivityIndicicator()
@property (strong,nonatomic) CAGradientLayer * indicatorLayer;
@property (strong,nonatomic) CAShapeLayer * shapeLayer;
@end

@implementation WCActivityIndicicator

-(CAShapeLayer *)shapeLayer{
    if (!_shapeLayer) {
        _shapeLayer = [CAShapeLayer layer];
        _shapeLayer.bounds = CGRectMake(0, 0, 100,100);
        _shapeLayer.position = CGPointMake(50,50);
        _shapeLayer.strokeColor = [UIColor blueColor].CGColor;
        _shapeLayer.fillColor = [UIColor clearColor].CGColor;
        CGMutablePathRef path = CGPathCreateMutable();
        _shapeLayer.lineWidth = 5.0;
//        _shapeLayer.backgroundColor = [UIColor purpleColor].CGColor;
        CGPathAddArc(path, nil,50, 50,45,0,2*M_PI,YES);
        _shapeLayer.path = path;
        //        roundShape.path
    }
    return _shapeLayer;
}
-(CAGradientLayer *)indicatorLayer{
    if (!_indicatorLayer){
        _indicatorLayer = [[CAGradientLayer alloc] init];
        _indicatorLayer.bounds = CGRectMake(0, 0, 100,100);
        _indicatorLayer.position = CGPointMake(50,50);
        _indicatorLayer.colors = @[(id)[UIColor blueColor].CGColor,
                                   (id)[UIColor greenColor].CGColor,
                                   (id)[UIColor blueColor].CGColor];
        // 颜色分割线
        _indicatorLayer.locations  = @[@(0.25), @(0.5), @(0.75)];
        _indicatorLayer.startPoint = CGPointMake(0.0, 0.0);
        _indicatorLayer.endPoint = CGPointMake(1.0,1.0);
        _indicatorLayer.masksToBounds = YES;
        [_indicatorLayer setMask:self.shapeLayer];
    }
    return _indicatorLayer;
}
/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {
    // Drawing code
}
*/
-(void)start{
    self.hidden = NO;
    [UIView animateWithDuration:1.0
                          delay:0.0
                        options:UIViewAnimationOptionRepeat | UIViewAnimationOptionCurveLinear
                        animations:^{
                            self.transform = CGAffineTransformMakeRotation(M_PI);
                        } completion:^(BOOL finished) {

                        }];
}
-(void)stop{
    [self.indicatorLayer removeAllAnimations];
    self.hidden = YES;
}

-(void)setUp{
    self.bounds = CGRectMake(0, 0,100,100);
    [self.layer addSublayer:self.indicatorLayer];
    self.hidden = YES;
}
-(instancetype)init{
    if (self = [super init]) {
        [self setUp];
    }
    return self;
}
@end

使用的viewcontroller

//
//  ViewController.m
//  WCActivityindicator
//
//  Created by huangwenchen on 15/2/17.
//  Copyright (c) 2015年 huangwenchen. All rights reserved.
//

#import "ViewController.h"
#import "WCActivityIndicicator.h"
@interface ViewController ()
@property (strong,nonatomic)WCActivityIndicicator * spinner;
@end

@implementation ViewController
- (IBAction)start:(id)sender {
    [self.spinner start];
}
- (IBAction)stop:(id)sender {
    [self.spinner stop];
}

- (void)viewDidLoad {
    [super viewDidLoad];    

    self.spinner = [[WCActivityIndicicator alloc] init];
    self.spinner.bounds = CGRectMake(0, 0, 100,100);
    self.spinner.center = self.view.center;
    [self.view addSubview:self.spinner];
    // Do any additional setup after loading the view, typically from a nib.
}

@end
时间: 2024-10-19 06:54:11

IOS 自定义控件之UIActivityIndicatorView的相关文章

iOS UIAlertView中UIActivityindicatorView风火轮提示加载等待

参考:http://stackoverflow.com/questions/18729220/uialertview-addsubview-in-ios7 1.SignInViewController.h #import <UIKit/UIKit.h> @interface SignInViewController : UIViewController<UIAlertViewDelegate>{ UIAlertView *remoteAlertView; } @end 2.Sign

IOS自定义控件学习

IOS自定义控件 参考:http://www.oschina.net/question/262659_141737 基本概念 UIView控件只是一个矩形的空白区域,并没有任何内容.iOS应用的其他UI控件都继承了UIView,这些UI控件都是在UIView提供的空白区域上绘制外观.也就是 UIView是所有控件的基类,自定义控件要从这里派生,实现自己的绘制. 重写的方法 initWithFrame 初始化方法. initWithCoder::程序通过在nib文件中加载完该控件后会自动调用该方法

iOS 自定义控件开发

工作需要,最近在进行iOS方面的图表工作.找了很多第三方库都无法实现效果,所以决定自己写一个控件. #0 目标 希望可以写一个通用的图表控件(仅针对此项目),虽然开发难度增大,但是可以学习到很多知识.并且控件使用简单,可以自适应大小,支持屏幕旋转. #1 准备工作 网上各种查资料 研究了一下系统自带控件,全部基于UIView 开发过程中使用storyboard,在页面中加入一个View来控制大小,自定义控件放入此view中并且填充满,让程序可以自适应屏幕尺寸. #2 开始自定义 创建自定义控件,

iOS自定义控件教程:制作一个可重用的旋钮

当你的APP需要一些新功能时,自定义UI控件会十分有用,尤其是这些自定义控件可以在其他APP里面很好的重用.Colin Eberhart写过一篇很棒的介绍自定义UI控件的教程.这个教程涉及的是一个继承自UISlider类的自定义控件的生成:该控件的功能是给定一个(滑动)范围供(用户滑动)选择,并返回一个(与滑动位置相对应的)固定值. 本篇基于iOS 7的自定义UI教程在Colin Eberhart那篇的基础上更深入一步:受调音台旋钮的启发,这里介绍如何制作一个功能类似UISlider的圆形旋转控

iOS 自定义控件

关于UIToolbar,UINavigationController,UINavigationBar,UIBarButtonItem在ios7的使用的简单的介绍,经过搜索资料做了如下的一些汇集 ----------------------------UIBarButtonItem---------------------------- 1:  UIBarButtonItem 隐藏的方式 [self.btnPunctuation setWidth:0]; 2:  UIBarButtonItem 获

IOS 自定义控件之UIAlertview

原创Blog,转载请注明出处 blog.csdn.net/hello_hwc 前言:这个系列的目的是写一些自定义控件的思路,并不是拿来就可以用的控件,想要直接用的控件库,去github上有的是.这个系列希望抛砖引玉,能够让读者学会如何去自定义控件,授之以渔总比授之以鱼强. 本文的内容 demo展示以及说明 如何自定义一个alertview 希望通过本文,读者能够学到 自定义控件的UI布局 自定义控件如何用代理传递事件 UIDynamic Animation 以及UIKit角度的Animation

IOS 自定义控件之-显示下载过程的ImageView

原创Blog,转载请注明出处 blog.csdn.net/hello_hwc 前言:这个系列的目的是为了提供一些思路,在Demo的过程中让读者学会一些自定义控件的思路,所以不适宜太复杂.当然,仅仅是抛砖引玉.这个控件我会上传Github,由于最近一直在搞IOT的应用,所以没时间把进行完善,有时间了我会把这个控件完善了,让读者那去直接就可以用. 完善好了我会更新下博客 Demo效果,支持两种显示过程的方式,沿着border绘制一圈和frame逐渐填充. 思路 NSURLSessionDataTas

iOS 自定义控件 progressView(环形进度条)

转帖:http://blog.csdn.net/xiangzhang321/article/details/42688133 之前做项目的时候有用到环形进度条,先是在网上找了一下第三方控件,发现好用是好用,就是东西太多了,有点复杂,还不如自己写一个简单点适合自己用的. 先把自定义控件的效果图贴出来.     其实我写的这个控件很简单.索性就直接把源码贴出来吧. .h文件的内容就是一些声明 #import <UIKit/UIKit.h> @interface ProgressView : UIV

IOS自定义控件

1 #ifndef GlobalDefine_h 2 #define GlobalDefine_h 3 4 #define SCREENWIDTH [[UIScreen mainScreen] bounds].size.width 5 #define SCREENHEIGHT [[UIScreen mainScreen] bounds].size.height 6 7 #endif /* GlobalDefine_h */ 1 #import <UIKit/UIKit.h> 2 3 @inte