- 浏览: 87735 次
- 性别:
- 来自: 昆明
src:http://blog.csdn.net/kmyhy/article/details/6869260
苹果无敌风火轮如果不是那么酷的话,我们就不需要定制它了。可惜的是,UIActivityIndicator只有一个初始化方法 initWithActivityIndicatorStyle,我们一不能任意改变它的大小——有时候我们需要一个比 UIActivityIndicatorViewStyleWhiteLarge还要更大的无敌风火轮;二,它不够友好——我们需要在风火轮的下面显示一些友好的提示信息。
为此,我们不惜代价,自己用一个UIActivityIndicator控件和用Quartz绘图的手段,定制了一个自己的无敌风火轮。
#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
#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];
[superViewaddSubview:self];
}
return self;
}
#pragma mark -
#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, 3 * (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, 3 * (float)M_PI / 2, 0);
// CGContextClosePath(context);// 关闭路径
CGContextFillPath(context);// 填充路径,该函数自动关闭路径
}
}
#pragma mark -
-(void)dealloc{
[maskView release];
[indicator release];
[label release];
[super dealloc];
}
#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;
}
-(void)hide{
visible=NO;
[indicator stopAnimating];
[self setHidden:YES];
}
-(void)setMessage:(NSString*)newMsg{
label.text=newMsg;
}
-(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
使用它非常简单,不会比原来更麻烦:
#import <UIKit/UIKit.h>
#import "MyProgressView.h"
@interface RootVC :UIViewController {
MyProgressView* indicator;
}
-(IBAction)btnClicked;
@end
#import "RootVC.h"
@implementation RootVC
-(IBAction)btnClicked{
NSLog(@"%s",__FUNCTION__);
if (indicator.visible==NO) {
[indicator show:NO];
}else {
[indicator hide];
}
}
- (id)initWithNibName:(NSString *)nibNameOrNilbundle:(NSBundle *)nibBundleOrNil {
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
}
return self;
}
- (void)viewDidLoad {
[super viewDidLoad];
indicator=[[MyProgressView alloc]initWithFrame:
CGRectMake(0, 0, 120, 120) superView:self.view];
//[indicatoralignToCenter];
}
- (void)viewDidUnload {
[super viewDidUnload];
// Release any retained subviews ofthe main view.
// e.g. self.myOutlet = nil;
}
- (void)dealloc {
[indicator release];
[super dealloc];
}
@end
show方法有一个BOOL值参数,如果你设置为YES,在无敌风火轮出现的同时,父视图界面会被冻结,用户将不能操作任何控件——我想这是我需要的。当hide方法被调用,风火轮消失,界面冻结被取消。一切就这么简单:
苹果无敌风火轮如果不是那么酷的话,我们就不需要定制它了。可惜的是,UIActivityIndicator只有一个初始化方法 initWithActivityIndicatorStyle,我们一不能任意改变它的大小——有时候我们需要一个比 UIActivityIndicatorViewStyleWhiteLarge还要更大的无敌风火轮;二,它不够友好——我们需要在风火轮的下面显示一些友好的提示信息。
为此,我们不惜代价,自己用一个UIActivityIndicator控件和用Quartz绘图的手段,定制了一个自己的无敌风火轮。
#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
#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];
[superViewaddSubview:self];
}
return self;
}
#pragma mark -
#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, 3 * (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, 3 * (float)M_PI / 2, 0);
// CGContextClosePath(context);// 关闭路径
CGContextFillPath(context);// 填充路径,该函数自动关闭路径
}
}
#pragma mark -
-(void)dealloc{
[maskView release];
[indicator release];
[label release];
[super dealloc];
}
#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;
}
-(void)hide{
visible=NO;
[indicator stopAnimating];
[self setHidden:YES];
}
-(void)setMessage:(NSString*)newMsg{
label.text=newMsg;
}
-(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
使用它非常简单,不会比原来更麻烦:
#import <UIKit/UIKit.h>
#import "MyProgressView.h"
@interface RootVC :UIViewController {
MyProgressView* indicator;
}
-(IBAction)btnClicked;
@end
#import "RootVC.h"
@implementation RootVC
-(IBAction)btnClicked{
NSLog(@"%s",__FUNCTION__);
if (indicator.visible==NO) {
[indicator show:NO];
}else {
[indicator hide];
}
}
- (id)initWithNibName:(NSString *)nibNameOrNilbundle:(NSBundle *)nibBundleOrNil {
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
}
return self;
}
- (void)viewDidLoad {
[super viewDidLoad];
indicator=[[MyProgressView alloc]initWithFrame:
CGRectMake(0, 0, 120, 120) superView:self.view];
//[indicatoralignToCenter];
}
- (void)viewDidUnload {
[super viewDidUnload];
// Release any retained subviews ofthe main view.
// e.g. self.myOutlet = nil;
}
- (void)dealloc {
[indicator release];
[super dealloc];
}
@end
show方法有一个BOOL值参数,如果你设置为YES,在无敌风火轮出现的同时,父视图界面会被冻结,用户将不能操作任何控件——我想这是我需要的。当hide方法被调用,风火轮消失,界面冻结被取消。一切就这么简单:
发表评论
-
HOW TO ADD PHOTOS TO THE IPHONE SIMULATOR
2012-12-25 15:49 737Building an app that needs to a ... -
截取部分图片并显示
2012-09-14 11:15 829src : http://marshal.easymorse ... -
va_start和va_end使用详解
2012-09-07 11:40 920src : http://www.cnblogs.co ... -
iPhone/iPad全屏截图与区域截图的几种方法
2012-09-06 13:48 4195http://www.cocoachina.com/newbi ... -
【转载】将int型数据转换成任意进制字符串的算法
2012-08-28 09:50 7291. http://hi.baidu.com/doking_b ... -
iOS 使用 predicate 限定 NSNumber 类型的数据
2012-07-02 13:25 901错误的写法: predicate = [NSPredicat ... -
在Mac OS X Lion系统中访问~/Library目录都需要点技巧
2012-07-02 10:52 1010Mac虚拟机升级为Lion系统了,在iPhone模拟机 ... -
XCode调试 设置全局断点并快速定位问题代码所在行
2012-06-20 19:17 0http://www.kaifazu.com/iOS_kfjc ... -
Error Domain=NSOSStatusErrorDomain Code=-9807
2012-06-14 10:28 6845Client 端连接服务器时会有时会遇到一下错误: ... -
iOS 的 keychain 简介
2012-05-03 10:38 1228src: http://www.cnblogs.com/v2m ... -
iOS 监听App音量的变化
2012-03-31 18:02 5506方法1: 在applicationDidFinish ... -
Exception and Signal
2012-03-27 15:11 642src: http://publib.boulder.ibm. ... -
Handling unhandled exceptions and signals
2012-03-27 14:54 735src: http://cocoawithlove.com/2 ... -
操作CoreData 常见的错误及解决方法
2012-03-07 18:06 790src: http://blog.csdn.net/ch_ ... -
scrollViewDidScroll 和scrollViewDidEndScrollingAnimation的区别
2012-02-23 11:30 4397UIScrollViewDelegate has got ... -
Google Talk 和 Google Voice 的终极整合
2012-02-15 10:14 812src : http://dan.febird.net/2 ... -
How To Use UIView Animation Tutorial
2012-02-08 16:20 722src: http://www.raywenderlich.c ... -
iOS应用程序状态切换相关
2012-01-31 15:14 836原文出处: http://blog.csdn.net/duan ... -
xcode4 设置调试错误信息小结
2012-01-17 13:17 900原文出处: http://blog.csdn.net/coc ... -
抓包工具charles使用方法
2012-01-08 14:08 3913这个是charles在mac上的使用方法 http://www ...
相关推荐
"iOS自定义风格弹窗"是这个话题的核心,它涉及到如何在iOS项目中创建并集成具有高度可定制性的弹窗组件。 首先,`CocoaPods`是iOS开发中的一个依赖管理工具,它允许开发者方便地引入第三方库,如自定义弹窗库。通过...
这个【标题】"ios自定义segement,有按钮有下滑线滑动"和【描述】"ios自定义的segement,自带下滑线,点击按钮会有颜色变化"就指出了一个自定义Segment Control的需求,即实现带有下滑线并且按钮在被选中时颜色会...
本教程将详细介绍如何在iOS应用中自定义倒计时控件,实现分秒级别的倒计时,并讨论如何轻松地将其集成到您的项目中。 首先,我们需要创建一个新的Swift文件,例如命名为`CustomCountdownView.swift`,在这个文件中...
本项目"ios-带缓存和风火轮的网络请求,自定义缓存时间.zip"显然关注的是如何高效、智能地处理网络请求,特别是缓存策略的定制。这个项目基于AFNetworking进行了封装,使得开发者可以更加便捷地实现网络请求,并且...
在iOS开发中,自定义字体可以为应用增添独特的视觉风格,提升用户体验。本文将深入探讨如何在iOS项目中实现自定义字体的加载与使用,基于提供的"ios自定义字体demo"进行讲解。 首先,我们需要准备自定义字体文件。...
在iOS开发中,自定义提示框(弹框)是一个常见的需求,它可以帮助用户更好地理解和交互应用中的信息。本文将深入探讨如何在iOS中创建自定义提示框,特别关注使用第三方库"Masonry"来实现布局。 首先,让我们了解...
在iOS开发中,自定义下载进度条是一种常见的需求,它能提供更加个性化和美观的用户体验。本教程将深入探讨如何在iPhone或iPad应用中实现这样的功能。我们将主要围绕以下知识点展开: 1. **UIProgressView**:苹果...
通过这个“自定义UIActivityIndicatorView(风火轮)”的示例,开发者不仅可以学习到如何使用MBProgressHUD,还可以了解到如何在iOS应用中自定义和管理加载指示器,从而提升应用的视觉效果和用户体验。在实际项目中,...
在iOS开发中,自定义相机和访问相册是常见的需求,尤其在开发摄影类或社交类应用时。本文将深入探讨如何使用Swift语言实现这一功能,主要涉及的知识点包括: 1. **AVFoundation框架**:iOS中用于处理音频和视频的主...
在iOS开发中,为了增强用户体验,我们经常需要实现一些自定义的交互效果,其中侧滑删除按钮功能就是一种常见的设计。这个例子展示了如何为UITableView的Cell添加自定义的侧滑删除按钮,使得用户可以轻松地对列表数据...
在iOS开发中,自定义导航栏(Navigation Bar)和表格(TableView)是两个非常重要的组件,它们被广泛用于构建各种用户界面。这篇学习笔记将深入探讨如何在iOS应用中实现自定义导航栏以及如何有效利用表格展示数据。 ...
在iOS应用开发中,自定义搜索框是提升用户体验的关键组件之一。它允许用户通过输入关键词快速查找所需内容,尤其在内容丰富的应用中显得尤为重要。本文将深入探讨如何在iOS中创建一个自定义搜索框,以及如何使其既...
本知识点将详细讲解如何在iOS应用中自定义TabBar,尤其是让中间按钮突出,并能实现页面切换。 1. 自定义TabBarItem - 使用`UITabBarItem`类,可以自定义每个标签的图标、文字和选中状态。通过设置`title`、`image`...
在iOS开发中,自定义密码输入框是一种常见的需求,它能提供更加个性化和安全的用户体验。本教程将详细讲解如何创建一个支持自定义密码样式的输入框,适用于各种iOS应用程序。 首先,我们要明白一个基本的iOS组件:`...
在iOS开发中,自定义键盘是一项常见的需求,它允许开发者为特定应用或用户场景提供更加个性化的输入体验。本文将深入探讨如何在iOS平台上创建一个支持英文大小写切换、数字及部分符号输入的自定义键盘。 首先,我们...
在iOS开发中,实现“ios自定义本地相册,多图片上传”的功能涉及到多个关键知识点。首先,我们需要了解iOS的媒体库访问权限以及如何使用系统提供的API来获取和选择用户的照片。以下是一些核心概念和步骤: 1. **...
在iOS开发中,创建一个自定义的车牌选择界面是一项具有挑战性的任务,它涉及到用户界面设计、触摸事件处理以及特定数据结构的管理。这个界面的主要目的是让用户能够方便地选择车牌的相关信息,包括车牌类型(如普通...
在iOS开发中,自定义键盘是一项常见的需求,它允许开发者为用户提供更为个性化和高效的操作体验。Objective-C作为苹果平台的主要编程语言之一,是实现这一功能的重要工具。本篇将深入探讨如何在iOS应用中创建自定义...
下面我们将深入探讨如何在iOS中实现自定义下拉刷新控件。 一、下拉刷新基础 1. UIRefreshControl:苹果提供的系统下拉刷新控件,内置了简单的旋转菊花动画。虽然简单易用,但样式有限,无法满足所有设计需求。 2....