你好,歡迎來到IOS教程網

 Ios教程網 >> IOS訊息 >> 關於IOS >> IOS開發之――自定義的Activity Indicator View

IOS開發之――自定義的Activity Indicator View

編輯:關於IOS

引用:

      蘋果無敵風火輪如果不是那麼酷的話,我們就不需要定制它了。可惜的是,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];   將它隱藏就好啦。
  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved