引用:
蘋果無敵風火輪如果不是那麼酷的話,我們就不需要定制它了。可惜的是,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];
將它隱藏就好啦。