iOS自訂LoadingView

來源:互聯網
上載者:User

應用開發的時候,載入資料的時候需要載入頁面,如果沒用,那麼就缺少人性化設計了。系統內建的是UIActivityIndicatorView,但它缺少文字說明,要加上文字說明的loading view只有自子封裝。代碼如下:

LoadingView.h

#import <UIKit/UIKit.h>@interface LoadingView : UIView{}+ (id)loadingViewInView:(UIView *)aSuperview;- (void)removeView;@end

LoadingView.m

#import "LoadingView.h"#import <QuartzCore/QuartzCore.h>//// NewPathWithRoundRect//// Creates a CGPathRect with a round rect of the given radius.//CGPathRef NewPathWithRoundRect(CGRect rect, CGFloat cornerRadius){//// Create the boundary path//CGMutablePathRef path = CGPathCreateMutable();CGPathMoveToPoint(path, NULL,rect.origin.x,rect.origin.y + rect.size.height - cornerRadius);// Top left cornerCGPathAddArcToPoint(path, NULL,rect.origin.x,rect.origin.y,rect.origin.x + rect.size.width,rect.origin.y,cornerRadius);// Top right cornerCGPathAddArcToPoint(path, NULL,rect.origin.x + rect.size.width,rect.origin.y,rect.origin.x + rect.size.width,rect.origin.y + rect.size.height,cornerRadius);// Bottom right cornerCGPathAddArcToPoint(path, NULL,rect.origin.x + rect.size.width,rect.origin.y + rect.size.height,rect.origin.x,rect.origin.y + rect.size.height,cornerRadius);// Bottom left cornerCGPathAddArcToPoint(path, NULL,rect.origin.x,rect.origin.y + rect.size.height,rect.origin.x,rect.origin.y,cornerRadius);// Close the path at the rounded rectCGPathCloseSubpath(path);return path;}@implementation LoadingView//// loadingViewInView://// Constructor for this view. Creates and adds a loading view for covering the// provided aSuperview.//// Parameters://    aSuperview - the superview that will be covered by the loading view//// returns the constructed view, already added as a subview of the aSuperview//(and hence retained by the superview)//+ (id)loadingViewInView:(UIView *)aSuperview{LoadingView *loadingView =[[[LoadingView alloc] initWithFrame:[aSuperview bounds]] autorelease];if (!loadingView){return nil;}loadingView.opaque = NO;loadingView.autoresizingMask =UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;[aSuperview addSubview:loadingView];const CGFloat DEFAULT_LABEL_WIDTH = 280.0;const CGFloat DEFAULT_LABEL_HEIGHT = 50.0;CGRect labelFrame = CGRectMake(0, 0, DEFAULT_LABEL_WIDTH, DEFAULT_LABEL_HEIGHT);UILabel *loadingLabel =[[[UILabel alloc]initWithFrame:labelFrame]autorelease];loadingLabel.text = NSLocalizedString(@"Loading...", nil);loadingLabel.textColor = [UIColor whiteColor];loadingLabel.backgroundColor = [UIColor clearColor];loadingLabel.textAlignment = UITextAlignmentCenter;loadingLabel.font = [UIFont boldSystemFontOfSize:[UIFont labelFontSize]];loadingLabel.autoresizingMask =UIViewAutoresizingFlexibleLeftMargin |UIViewAutoresizingFlexibleRightMargin |UIViewAutoresizingFlexibleTopMargin |UIViewAutoresizingFlexibleBottomMargin;[loadingView addSubview:loadingLabel];UIActivityIndicatorView *activityIndicatorView =[[[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]autorelease];[loadingView addSubview:activityIndicatorView];activityIndicatorView.autoresizingMask =UIViewAutoresizingFlexibleLeftMargin |UIViewAutoresizingFlexibleRightMargin |UIViewAutoresizingFlexibleTopMargin |UIViewAutoresizingFlexibleBottomMargin;[activityIndicatorView startAnimating];CGFloat totalHeight =loadingLabel.frame.size.height +activityIndicatorView.frame.size.height;labelFrame.origin.x = floor(0.5 * (loadingView.frame.size.width - DEFAULT_LABEL_WIDTH));labelFrame.origin.y = floor(0.5 * (loadingView.frame.size.height - totalHeight));loadingLabel.frame = labelFrame;CGRect activityIndicatorRect = activityIndicatorView.frame;activityIndicatorRect.origin.x =0.5 * (loadingView.frame.size.width - activityIndicatorRect.size.width);activityIndicatorRect.origin.y =loadingLabel.frame.origin.y + loadingLabel.frame.size.height;activityIndicatorView.frame = activityIndicatorRect;// Set up the fade-in animationCATransition *animation = [CATransition animation];[animation setType:kCATransitionFade];[[aSuperview layer] addAnimation:animation forKey:@"layerAnimation"];return loadingView;}//// removeView//// Animates the view out from the superview. As the view is removed from the// superview, it will be released.//- (void)removeView{UIView *aSuperview = [self superview];[super removeFromSuperview];// Set up the animationCATransition *animation = [CATransition animation];[animation setType:kCATransitionFade];[[aSuperview layer] addAnimation:animation forKey:@"layerAnimation"];}//// drawRect://// Draw the view.//- (void)drawRect:(CGRect)rect{rect.size.height -= 1;rect.size.width -= 1;const CGFloat RECT_PADDING = 8.0;rect = CGRectInset(rect, RECT_PADDING, RECT_PADDING);const CGFloat ROUND_RECT_CORNER_RADIUS = 5.0;CGPathRef roundRectPath = NewPathWithRoundRect(rect, ROUND_RECT_CORNER_RADIUS);CGContextRef context = UIGraphicsGetCurrentContext();const CGFloat BACKGROUND_OPACITY = 0.85;CGContextSetRGBFillColor(context, 0, 0, 0, BACKGROUND_OPACITY);CGContextAddPath(context, roundRectPath);CGContextFillPath(context);const CGFloat STROKE_OPACITY = 0.25;CGContextSetRGBStrokeColor(context, 1, 1, 1, STROKE_OPACITY);CGContextAddPath(context, roundRectPath);CGContextStrokePath(context);CGPathRelease(roundRectPath);}//// dealloc//// Release instance memory.//- (void)dealloc{    [super dealloc];}@end

記得要加入QuartzCore.framework 到工程。

用法就更簡單了,加入的時候只需調用:

LoadingView *loadingView = [LoadingView loadingViewInView:[self.view.window.subviews objectAtIndex:0]];

刪除的時候只需調用:

[loadingView removeFromSuperview];
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.