引用:
蘋果無敵風火輪如果不是那麼酷的話,我們就不需要定制它了。可惜的是,UIActivityIndicator只有一個初始化方法 initWithActivityIndicatorStyle。 一,不能任意改變它的大小——有時候我們需要一個比 UIActivityIndicatorViewStyleWhiteLarge還要更大的無敵風火輪; 二,它不夠友好——我們需要在風火輪的下面顯示一些友好的提示信息。 為此,我們不惜代價,自己用一個UIActivityIndicator控件和用Quartz繪圖的手段,定制了一個自己的無敵風火輪。 實現自己的無敵風火輪主要思想如下: 1. 首先建一個MyProgressView類繼承UIView,因為我們打算新建一個UIView,在上面添加Indicator和文字並且繪制背景,然後把這個View放到當前界面中 2. 然後就是對這個MyprogressView進行操作了,重寫initWithFrame,根據傳進來的坐標和大小繪制,固定Indicator和Lable的位置和大小,並且添加到我們定義的外部框架viewHud 中 3. 重寫drawRect,判斷自定義的view是否可見,可見就繪制圓角矩形,主要根據CGRect繪制路線並根據CGContextFillPath將路線進行顏色填充,這個函數是在自定義view顯示之後執行的,所以我們可以在裡面進行view移位操作,通過CGRectOffset函數將CGRect進行移位,也可以調用alignToCenter將其居中 4. show,hide,setMessage主要是用來對我們定義的view進行進一步的操作 5. alignToCenter主要是將當前的自定義view進行移位操作 請看源碼: MyProgressView.h文件 [objc] // // MyProgressView.h // FourthIOSProject // // Created by Mac on 14-4-16. // Copyright (c) 2014年 Mac. All rights reserved. // #import <Foundation/Foundation.h> #import <UIKit/UIKit.h> @interface MyProgressView : UIView{ UIActivityIndicatorView* indicator; UILabel* label; BOOL visible,blocked; UIView* maskView; CGRect rectHud,rectSuper,rectOrigin;//外殼區域、父視圖區域 UIView* viewHud;//外殼 } @property (assign) BOOL visible; -(id)initWithFrame:(CGRect)frame superView:(UIView*)superView; -(void)show:(BOOL)block;// block:是否阻塞父視圖 -(void)hide; -(void)setMessage:(NSString*)newMsg; -(void)alignToCenter; @end MyProgressView.m 文件 [objc] view plaincopyprint?在CODE上查看代碼片派生到我的代碼片 // // MyProgressView.m // FourthIOSProject // // Created by Mac on 14-4-16. // Copyright (c) 2014年 Mac. All rights reserved. // #import "MyProgressView.h" @implementation MyProgressView @synthesize visible; -(id)initWithFrame:(CGRect)frame superView:(UIView*)superView{ rectOrigin=frame; rectSuper=[superView bounds]; //保持正方形比例 rectHud=CGRectMake(frame.origin.x,frame.origin.y, frame.size.width, frame.size.width); self = [super initWithFrame:rectHud]; if (self) { self.backgroundColor =[UIColor clearColor]; self.opaque = NO; viewHud=[[UIView alloc]initWithFrame:rectHud]; [self addSubview:viewHud]; indicator=[[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle: UIActivityIndicatorViewStyleWhiteLarge]; double gridUnit=round(rectHud.size.width/12); float ind_width=6*gridUnit; indicator.frame=CGRectMake( 3*gridUnit, 2*gridUnit, ind_width, ind_width); [viewHud addSubview:indicator]; CGRect rectLabel=CGRectMake(1*gridUnit, 9*gridUnit, 10*gridUnit, 2*gridUnit); label=[[UILabel alloc]initWithFrame:rectLabel]; label.backgroundColor=[UIColor clearColor]; label.font=[UIFont fontWithName:@"Arial" size:14]; label.textAlignment=UITextAlignmentCenter; label.textColor=[UIColor whiteColor]; label.text=@"請等待..."; label.adjustsFontSizeToFitWidth=YES; [viewHud addSubview:label]; visible=NO; [self setHidden:YES]; [superView addSubview:self]; } return self; } #pragma mark Drawing - (void)drawRect:(CGRect)rect { if(visible){ CGContextRef context = UIGraphicsGetCurrentContext(); CGRect boxRect = rectHud; // 繪制圓角矩形 float radius = 10.0f; // 路徑開始 CGContextBeginPath(context); // 填充色:灰度0.0,透明度:0.1 CGContextSetGrayFillColor(context,0.0f, 0.25); // 畫筆移動到左上角的圓弧處 CGContextMoveToPoint(context,CGRectGetMinX(boxRect) + radius, CGRectGetMinY(boxRect)); // 開始繪制右上角圓弧:圓心x坐標,圓心y坐標,起始角,終止角,方向為順時針 CGContextAddArc(context,CGRectGetMaxX(boxRect) - radius, CGRectGetMinY(boxRect) + radius, radius, 33 * (float)M_PI / 2, 0, 0); // 開始繪制右下角圓弧 CGContextAddArc(context,CGRectGetMaxX(boxRect) - radius, CGRectGetMaxY(boxRect) - radius, radius, 0, (float)M_PI / 2, 0); // 開始繪制左下角圓弧 CGContextAddArc(context,CGRectGetMinX(boxRect) + radius, CGRectGetMaxY(boxRect) - radius, radius, (float)M_PI / 2, (float)M_PI, 0); // 開始繪制左上角圓弧 CGContextAddArc(context,CGRectGetMinX(boxRect) + radius, CGRectGetMinY(boxRect) + radius, radius, (float)M_PI, 33 * (float)M_PI / 2, 0); // NSLog(@"MinX is:%f",CGRectGetMinX(boxRect)); // NSLog(@"MaxX is:%f",CGRectGetMaxX(boxRect)); // NSLog(@"MinY is:%f",CGRectGetMinY(boxRect)); // NSLog(@"MaxY is:%f",CGRectGetMaxY(boxRect)); // CGContextClosePath(context);// 關閉路徑 CGContextFillPath(context);// 填充路徑,該函數自動關閉路徑 //將畫面按照這個方向平移 //[self setFrame:CGRectOffset(self.frame, 100, 160)]; //這行代碼是最新添加的,表示繪制結束後,講畫面放到屏幕最中間 [self alignToCenter]; } } #pragma mark Action -(void)show:(BOOL)block{ if (block && blocked==NO) { CGPoint offset=self.frame.origin; // 改變視圖大小為父視圖大小 self.frame=rectSuper; viewHud.frame=CGRectOffset(viewHud.frame, offset.x, offset.y); if (maskView==nil) { maskView=[[UIView alloc]initWithFrame:rectSuper]; }else{ maskView.frame=rectSuper; } maskView.backgroundColor=[UIColor clearColor]; [self addSubview:maskView]; [self bringSubviewToFront:maskView]; blocked=YES; } [indicator startAnimating]; [self setHidden:NO]; [self setNeedsLayout]; visible=YES; } #pragma mark 將這個東東隱藏 -(void)hide{ visible=NO; [indicator stopAnimating]; [self setHidden:YES]; } #pragma mark 改變裡面的文字 -(void)setMessage:(NSString*)newMsg{ label.text=newMsg; } #pragma mark 將這個東東居中 -(void)alignToCenter{ CGPoint centerSuper={rectSuper.size.width/2,rectSuper.size.height/2}; CGPoint centerSelf={self.frame.origin.x+self.frame.size.width/2, self.frame.origin.y+self.frame.size.height/2}; CGPoint offset={centerSuper.x-centerSelf.x,centerSuper.y-centerSelf.y}; CGRect newRect=CGRectOffset(self.frame, offset.x, offset.y); [self setFrame:newRect]; rectHud=newRect; // NSLog(@"newRect:%f,%f",newRect.origin.x,newRect.origin.y); } @end 那麼如何引用上面的代碼產生效果呢? ViewController.m 裡面的引用代碼如下: [objc] view plaincopyprint?在CODE上查看代碼片派生到我的代碼片 - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. //在頁面中添加一個Activity Indicator View //這玩意不用了,太丑,現在換大的了 // UIActivityIndicatorView *indicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; // [indicator setCenter:CGPointMake(100, 100)]; // [self.view addSubview:indicator]; // [indicator startAnimating]; MyProgressView *indicator = [[MyProgressView alloc]initWithFrame:CGRectMake(0, 0, 120, 120) superView:self.view]; [indicator setMessage:@"正在接受心電數據請稍候..."]; if (indicator.visible==NO) { [indicator show:NO]; }else { [indicator hide]; } } 在頁面加載的時候我就想讓Indicator出現了,使用 [objc] [indicator hide]; 將它隱藏就好啦。