自定义progressHHUD

#import <UIKit/UIKit.h>

@interface ProgressHUD : UIView

+ (void)show;

+ (void)dismiss;

+ (void)dismissWithDelay:(NSTimeInterval)delay;

@end

#import "ProgressHUD.h"

#import "CookImageView.h"

#import "CookLabel.h"

#define BOUNDS [[[UIApplication sharedApplication] delegate] window].bounds

@interface ProgressHUD ()

@property (nonatomic, strong) UIView *hudView;

@property (nonatomic, strong) CookLabel *statusLabel;

@property (nonatomic, strong) CookImageView *imageView;

@end

@implementation ProgressHUD

+ (void)show{

[self sharedView];

[[self sharedView] show];

}

+ (void)dismiss{

[[self sharedView] dismissWithDelay:0.0f];

}

+ (void)dismissWithDelay:(NSTimeInterval)delay{

[[self sharedView] dismissWithDelay:delay];

}

+ (ProgressHUD *)sharedView {

static dispatch_once_t onceToken;

static ProgressHUD *sharedView;

dispatch_once(&onceToken, ^{

sharedView = [[self alloc] initWithFrame:BOUNDS];

sharedView.backgroundColor = [UIColor blackColor];

sharedView.alpha = 0.5f;

});

return sharedView;

}

- (void)updateViewHierachy {

NSEnumerator *frontToBackWindows = [UIApplication.sharedApplication.windows reverseObjectEnumerator];

for (UIWindow *window in frontToBackWindows) {

BOOL windowOnMainScreen = window.screen == UIScreen.mainScreen;

BOOL windowIsVisible = !window.hidden && window.alpha > 0;

BOOL windowLevelNormal = window.windowLevel == UIWindowLevelNormal;

if(windowOnMainScreen && windowIsVisible && windowLevelNormal) {

[window addSubview:self.hudView];

break;

}

}

if (!self.superview) {

[self.hudView addSubview:self];

}

}

- (void)registerNotifications {

[[NSNotificationCenter defaultCenter] addObserver:self

selector:@selector(positionHUD:)

name:UIApplicationDidChangeStatusBarOrientationNotification

object:nil];

}

- (void)positionHUD:(NSNotification*)notification {

CGRect orientationFrame = BOUNDS;

CGFloat activeHeight = CGRectGetHeight(orientationFrame);

self.hudView.center = CGPointMake(CGRectGetWidth(orientationFrame)/2.0f, floorf(activeHeight*0.45f));

[self.hudView setNeedsDisplay];

}

- (void)show{

__weak ProgressHUD *weakSelf = self;

[[NSOperationQueue mainQueue] addOperationWithBlock:^{

__strong ProgressHUD *strongSelf = weakSelf;

if(strongSelf){

[strongSelf updateViewHierachy];

strongSelf.imageView.image = [[UIImage imageNamed:@"loadingIcon"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];

strongSelf.statusLabel.text = @"读取中...";

[strongSelf positionHUD:nil];

[strongSelf registerNotifications];

}

}];

}

- (UIView*)hudView {

if(!_hudView) {

_hudView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 82, 105)];

_hudView.layer.masksToBounds = YES;

_hudView.layer.cornerRadius = 6.0f;

_hudView.backgroundColor = [UIColor clearColor];

}

return _hudView;

}

- (CookLabel *)statusLabel {

_statusLabel = [CookLabel onlyOneLabel];

_statusLabel.frame = CGRectMake(0, 80, 82, 25);

_statusLabel.textAlignment = NSTextAlignmentCenter;

_statusLabel.textColor = [UIColor whiteColor];

_statusLabel.font = [UIFont systemFontOfSize:12.0f];

if (!_statusLabel.superview) {

[self.hudView addSubview:_statusLabel];

}

return _statusLabel;

}

- (CookImageView *)imageView{

_imageView = [CookImageView onlyOneImage];

_imageView.frame = CGRectMake(5, 5, 72, 72);

if (!_imageView.superview) {

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];

animation.fromValue = (id) 0;

animation.toValue = @(M_PI*2);

animation.duration = 1.0f;

animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];

animation.removedOnCompletion = NO;

animation.repeatCount = INFINITY;

animation.fillMode = kCAFillModeForwards;

animation.autoreverses = NO;

[_imageView.layer addAnimation:animation forKey:@"rotate"];

[self.hudView addSubview:_imageView];

}

return _imageView;

}

- (void)dismissWithDelay:(NSTimeInterval)delay{

__weak ProgressHUD *weakSelf = self;

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delay * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

__strong ProgressHUD *strongSelf = weakSelf;

if(strongSelf){

[_statusLabel removeFromSuperview];

[_imageView removeFromSuperview];

[_hudView removeFromSuperview];

[strongSelf removeFromSuperview];

[[NSNotificationCenter defaultCenter] removeObserver:strongSelf];

}

});

}

@end

@interface CookImageView : UIImageView

+ (instancetype)onlyOneImage;

@end

#import "CookImageView.h"

static CookImageView *_imageView;

@implementation CookImageView

+ (instancetype)onlyOneImage{

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

_imageView = [[self alloc] init];

});

return _imageView;

}

+(instancetype)allocWithZone:(struct _NSZone *)zone{

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

_imageView = [super allocWithZone:zone];

});

return _imageView;

}

@end

#import <UIKit/UIKit.h>

@interface CookLabel : UILabel

+ (instancetype)onlyOneLabel;

@end

#import "CookLabel.h"

static CookLabel *_label;

@implementation CookLabel

+ (instancetype)onlyOneLabel{

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

_label = [[CookLabel alloc] init];

});

return _label;

}

+ (instancetype)allocWithZone:(struct _NSZone *)zone{

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

_label = [super allocWithZone:zone];

});

return _label;

}

@end

时间: 2024-10-12 15:39:58

自定义progressHHUD的相关文章

Linux centos下让alias自定义永久生效(+常用的别名)

alias可以简化一些复杂的命令串,使一个单词或简化后的命令即可实现复杂(通常是带很多参数的长串)命令. 基本用法: alias 简化命令='实际的长串命令'    //实际长串命令通常为'原命令 -/选项参数' eg. alias ll='ls -a' 获取别名: alias        //即可查看当前设定的所有alias别名 取消别名: unalias 简化命令 eg. unalias ll            //取消ll的别名 永久生效: 直接使用alias命令定义的别名,重启后就

MVC4 自定义错误页面(三)

一.概述 MVC4框架自带了定义错误页,该页面位于Shared/Error,该页面能够显示系统未能捕获的异常,如何才能使用该页面: 二.使用步骤: 1.配置WebConfig文件,在System.Web节点下加上 <customErrors mode="On"  defaultRedirect="~/Shared/Error" /> 翻阅一些大神写的博客,在他们的博客中指出defaultRedirect是指向错误页面的URL,可是经过本人测试的时候,发现

自定义及发布一个webservice服务

自定义及发布一个webservice服务    - 声明 某个业务服务为webservice服务       通过@webservice 注解来声明    - 发布webservice服务       Endpoint.publish()发布 (默认对public修饰的方法进行发布)    - 通过wsimport生成本地代理来访问自己发布的webservice       wsimport 1.发布自定义webservice phone.java package ws.myWebService

前端angularJS利用directive实现移动端自定义软键盘的方法

最近公司项目的需求上要求我们iPad项目上一些需要输入数字的地方用我们自定义的软键盘而不是移动端设备自带的键盘,刚接到需求有点懵,因为之前没有做过,后来理了一下思路发现这东西也就那样.先看一下实现之后的效果: 实现的效果就是当点击页面中需要弹出软键盘的时候软键盘弹出,浮在页面的中间,和模态框一样的效果,可以在软键盘中输入任何数字,附带的功能有小数点.退格.清空.确定等功能.当在键盘上点击数字的时候页面中的表单中实时的添加对应的数字,上图中可以看到. 产品经理那边给的原因是iPad屏幕本来就小,如

自定义input[type=&quot;checkbox&quot;]的样式

对复选框自定义样式,我们以前一直用的脚本来实现,不过现在可以使用新的伪类 :checkbox 来实现. 如果直接对复选框设置样式,那么这个伪类并不实用,因为没有多少样式能够对复选框起作用.不过,倒是可以基于复选框的勾选状态借助组合选择符来给其他元素设置样式. 很多时候,无论是为了表单元素统一,还是为了用户体验良好,我们都会选择 label 元素和 input[type="checkbox"] 一起使用.当<label>元素与复选框关联之后,也可以起到触发开关的作用. 思路:

[CSS揭秘]自定义单选框和复选框

很多Web前端工程师肯定都会遇到过,在项目中,UI设计师跑来跟你说,我这个地方的表单控件需要设计成这个样子那个样子.但是用CSS却不能够修改这些控件的默认样式,于是乎,只能通过div+javascript技术来进行模拟.特别是在如今移动端的崛起时代,更加注重用户的体验.于是就更加需要这样一种hack技术. 如果对如今的前端框架有过了解,都会知道组件这个概念.那么在这些框架中,都会提供一些单选框或复选框按钮组件.可见大家之前受到表单元素的默认样式的毒害有多深. 今天先给大家简单介绍一下如何通过CS

自定义元素(custom elements)

记录下自定义html自定义元素的相关心得: 浏览器将自定义元素保留在 DOM 之中,但不会任何语义.除此之外,自定义元素与标准元素都一致 事实上,浏览器提供了一个HTMLUnknownElement,HTMLElement对象,所有自定义元素都是该对象的实例. var tabs=document.createElement("tabs"); console.log(tabs instanceof HTMLUnknownElement);//true console.log(tabs i

wex5 教程 自定义action与名称去重

有一个订单,需要取出不同的客户名称,且只显示一次名称.效果如下图: 一 思路:自定义action,用sql语句的group by分组,将名称返回前端,用list显示出来. 二 制作步骤: 1 新建service service作为后端服务分发接口,一个工程可以有多个service,一个service可以有多个action. 2  新建action action基本参数: 名称:自定义 实现:(指向 java方法) 格式为 Name.getName   其中Name为java类,首写字母必须为大写

springmvc 类型转换器 自定义类型转换器

自定义类型转换器的步骤: 1.定义类型转换器 2.类型转换器的注册(在springmvc配置文件处理) 来解决多种日期格式的问题: