iOS開發過程當中的小技巧

轉載自:http://blog.csdn.net/a451493485/article/details/8598839php

iphone程序中實現截屏的一種方法
在iphone程序中實現截屏的一種方法:html

 

//導入頭文件
#import QuartzCore/QuartzCore.h
//將整個self.view大小的圖層形式建立一張圖片image UIGraphicsBeginImageContext(self.view.bounds.size);
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage*image=UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
//而後將該圖片保存到圖片圖
c++

UIImageWriteToSavedPhotosAlbum(image,self,nil,nil);git

 

延時函數和Timer的使用
延時函數:
[NSThread sleepForTimeInterval:5.0]; //暫停5s.
Timer的使用:
NSTimer *connectionTimer;  //timer對象
//實例化timer
self.connectionTimer=[NSTimerscheduledTimerWithTimeInterval:1.5 target:selfselector:@selector(timerFired:) userInfo:nil repeats:NO];
[[NSRunLoop currentRunLoop]addTimer:self.connectionTimer forMode:NSDefaultRunLoopMode];
//用timer做爲延時的一種方法   
do{
[[NSRunLoopcurrentRunLoop]runUntilDate:[NSDatedateWithTimeIntervalSinceNow:1.0]];
}while(!done); 
//timer調用函數
-(void)timerFired:(NSTimer *)timer{
done =YES;
}編程

啓動界面的製做
iPhone開發實現splash畫面很是簡單,作一個全屏的歡迎頁的圖片,把它命名爲Default.png,而後放在Xcode工程的Resource裏面。
在XXXAppDelegate.m程序中,插入以下代碼:
- (BOOL)application:(UIApplication*)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  //–inserta delay of 5 seconds before the splash screendisappears–
  [NSThread sleepForTimeInterval:5.0];
  //Override point for customization after applicationlaunch.
  //Add the view controller’s view to the window anddisplay.
  [windowaddSubview:viewController.view];
  [windowmakeKeyAndVisible];
  return YES;
}
這樣splash頁面就停留5秒後,消失了。

翻頁效果
常常看到iPhone的軟件向上向下翻頁面的效果,其實這個很簡單,已經有封裝好的相關方法處理。
//首先設置動畫的相關參數
[UIView beginAnimations:@"Curl"context:nil];
[UIView setAnimationDuration:1.25]; //時間
[UIViewsetAnimationCurve:UIViewAnimationCurveEaseInOut];//速度
//而後設置動畫的動做和目標視圖
[UIViewsetAnimationTransition:UIViewAnimationTransitionCurlUp forView:self.view cache:YES];
參數UIViewAnimationTransitionCurlUp表明向上翻頁,若是向下的話UIViewAnimationTransitionCurlDown.
forView那把當前的視圖傳進去。
//最後提交動畫
[UIView commitAnimations];windows


截取屏幕圖片
//建立一個基於位圖的圖形上下文並指定大小爲CGSizeMake(200,400)
UIGraphicsBeginImageContext(CGSizeMake(200,400));
//renderInContext 呈現接受者及其子範圍到指定的上下文
[self.view.layerrenderInContext:UIGraphicsGetCurrentContext()];
 //返回一個基於當前圖形上下文的圖片
 UIImage *aImage =UIGraphicsGetImageFromCurrentImageContext();
 //移除棧頂的基於當前位圖的圖形上下文
UIGraphicsEndImageContext();
//以png格式返回指定圖片的數據
imageData = UIImagePNGRepresentation(aImage);瀏覽器

使用NSTimer與iphone的簡單動畫,實現飄雪效果
使用NSTimer與iphone的簡單動畫,實現飄雪效果,這理原理比較簡單,就是定時生成必定的雪花圖片,而後使用動畫的方式向下漂落(我在其它論壇,看到使用path的方式實現的一個雲漂來漂去的效果,實際也能夠用那種方式實現,這實際就是前面說的動畫效果的兩種應用)。因此,咱們能夠在 viewDidLoad事件中,增長一個圖片及定時器並啓動,這裏的pic請在頭文件中定義。
-(void)viewDidLoad{
 [super viewDidLoad];
 self.pic = [UIImage imageNamed:@"snow.png"];//初始化圖片
 //啓動定時器,實現飄雪效果
 [NSTimer scheduledTimerWithTimeInterval:(0.2) target:self selector:@selector(ontime) userInfo:nil repeats:YES];
}
而後再實現定時器定時調用的ontime方法:
-(void)ontime{
 UIImageView *view = [[UIImageView alloc] initWithImage:pic];//聲明一個UIImageView對象,用來添加圖片
 view.alpha = 0.5;//設置該view的alpha爲0.5,半透明的
 int x = round(random()%320);//隨機獲得該圖片的x座標
 int y = round(random()%320);//這個是該圖片移動的最後座標x軸的
 int s = round(random()%15)+10;//這個是定義雪花圖片的大小
 int sp = 1/round(random()%100)+1;//這個是速度
 view.frame = CGRectMake(x, -50, s, s);//雪花開始的大小和位置
 [self.view addSubview:view];//添加該view
 [UIView beginAnimations:nil context:view];//開始動畫
 [UIView setAnimationDuration:10*sp];//設定速度
 view.frame = CGRectMake(y, 500, s, s);//設定該雪花最後的消失座標
 [UIView setAnimationDelegate:self];
 [UIView commitAnimations];
}
使用NSTimer實現倒計時
今天在CocoaChina上面看到有人在問倒計時怎麼作,記得之前在看Iphone31天的時候作過一個,今天翻出來運行不了了,緣由是個人IphoneSDK升級到3.1了,之前使用的是2.2.1,在2.2.1裏面是可使用NSCalendarDate的,可是在3.1裏面不可以使用,怎麼辦,只好用NSTimer了,最後仍是給實現了。代碼也比較簡單,開始運行viewDidLoad的時候加載 [NSTimerscheduledTimerWithTimeInterval:1.0 target:selfselector:@selector(timerFireMethod:) userInfo:nilrepeats:YES];//使用timer定時,每秒觸發一次
,而後就是寫selector了。
-(void)timerFireMethod:(NSTimer*)theTimer
{
 //NSDateFormatter *dateformatter =[[[NSDateFormatter alloc]init]autorelease];//定義NSDateFormatter用來顯示格式
 //[dateformatter setDateFormat:@"yyyy MM dd hh mmss"];//設定格式
 NSCalendar *cal = [NSCalendarcurrentCalendar];//定義一個NSCalendar對象
 NSDateComponents *shibo = [[NSDateComponentsalloc] init];//初始化目標時間(好像是世博會的日期)
 [shibo setYear:2010];
 [shibo setMonth:5];
 [shibo setDay:1];
 [shibo setHour:8];
 [shibo setMinute:0];
 [shibo setSecond:0];
 
 NSDate *todate = [caldateFromComponents:shibo];//把目標時間裝載入date
 [shibo release];
// NSString *ssss = [dateformatterstringFromDate:dd];
// NSLog([NSString stringWithFormat:@"shiboshi:%@",ssss]);
 
 NSDate *today = [NSDate date];//獲得當前時間
// NSString *sss = [dateformatterstringFromDate:today];
// NSLog([NSString stringWithFormat:@"xianzaishi:%@",sss]);
 //用來獲得具體的時差
 unsigned int unitFlags = NSYearCalendarUnit |NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit |NSMinuteCalendarUnit | NSSecondCalendarUnit;
 NSDateComponents *d = [cal components:unitFlagsfromDate:today toDate:todate options:0];
 lab.text = [NSStringstringWithFormat:@"%d年%d月%d日%d時%d分%d秒",[d year],[d month], [d day],[d hour], [d minute], [d second]];
}
這樣就實現了倒計時的功能。
Iphone幻燈片效果+背景音樂
今天弄了幾張好看的圖片,我就摸索着實現了圖片的幻燈片效果,這個之前也實現過了,也算是溫故知新吧,另外就是使用SoundEngine類實現背景音樂的播放。SoundEngine類能夠從[url=read.php?tid-1215.html]http://www.cocoachina.com/bbs/read.php?tid-1215.html[/url]下載到。
代碼很簡單貼出來,以備不時只需:
-(void)viewDidLoad
{
 array = [[NSMutableArray alloc] init];
 int i = 1;
 for(i;i<=30;i++)
 {
  [array addObject:[UIImageimageNamed:[NSString stringWithFormat:@"%d.jpg",i]]];
 }
 pictures.animationImages = array;
 pictures.animationDuration = 300;//時間間隔
 pictures.animationRepeatCount = 0;//循環播放
 [pictures startAnimating];//開始播放
//播放背景音樂,利用SoundEngine類進行播放
 SoundEngine_SetListenerPosition(0.0, 0.0,1.0);
 SoundEngine_Initialize(44100);
 SoundEngine_LoadBackgroundMusicTrack([[[NSBundlemainBundle] pathForResource:@"win" ofType:@"caf"] UTF8String],true, true);
 SoundEngine_StartBackgroundMusic();
}
用這種方法播放好像挺佔用資源的,比較卡,之後再研究研究其它的方法。
NSTimer的用法
iPhone爲咱們提供了一個很強大得時間定時器 NSTimer,它能夠完成任何定時功能:
咱們使用起來也很簡單,只要記住三要素就能夠,具體得三要素是:時間間隔NSTimeInterval浮點型,事件代理delegate和事件處理方法@selector();
就能夠用
1 +(NSTimer *)scheduledTimerWithTimeIn
2 terval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)yesOrNo; 
[/pre]來初始化一個 時間定時器
下面我寫了一個很簡單得例子:
-(void)initTimer
 {
//時間間隔4 NSTimeInterval timeInterval =1.0;
 //定時器6 NSTimer   showTimer =[NSTimer scheduledTimerWithTimeInterval:maxShowTime 
target:self
selector:@selector(handleMaxShowTimer:)
userInfo:nil
 repeats:NO];
}
//觸發事件13 -(void)handleMaxShowTimer:(NSTimer *)theTimer
 {
NSDateFormatter dateFormator =[[NSDateFormatter alloc] init];
 dateFormator.dateFormat =@"yyyy-MM-dd  HH:mm:ss";
 NSString *date =[dateformater stringFromDate:[NSDate date]];
 if([date isEqualToString:@"2010-11-09 23:59:59"])
 {
 UIAlertView *alert =[[UIAlertView alloc] initWithTitle:TITLE_NAME
message:@"如今立刻就有新的一天了!"22 delegate:self
 cancelButtonTitle:nil
 otherButtonTitles:CONFIRM_TITLE, nil];
 [alert show];
[alert release];
}
[data release];
 [dateFormator release];
 }
iphone開發之 - 啓動頁面設置
         無論是開發我的項目仍是公司項目,你們一般都有一個需求,就是,在app啓動的時候,指定必定的時間來顯示本身的或者公司的logo,那麼,我就將剛剛寫好的啓動加載頁面設置代碼貢獻出來。(不對指出請留言,好的話也給我留個言吧,鼓勵下我!呵呵)
        這裏我須要用到NSTimer這個東西,相關的內容能夠查看API,有比較詳細的解釋。
          新建一個項目,隨即是什麼項目,我創建的是「view based application」,而後,命名爲「Logo」,而後肯定。
          直接編輯「Resources"目錄下的"LogoViewController.xib」。將背景顏色改稱綠色,主要是爲了當從logo頁跳轉過來的時候能有感受到變化。
          而後新建一個NSTimer.

logoviewcon*lo = [[logoviewconalloc] initWithNibName:@"logoviewcon"bundle:nil];
self.logo = lo;
[lo release];
[windowaddSubview:self.logo.view];
//初始化timmer
NSTimer*timer =  [NSTimerscheduledTimerWithTimeInterval: 1.5target: selfselector: @selector(logo:) userInfo: nilrepeats: YES];
注意,初始化的代碼中有這麼一段:@selector(logo:),其中的方法就是當這個1.5秒時間過去以後自動調用的方法。
-(void) logo:(NSTimer*)timer{
[logo.view removeFromSuperview];
[timer invalidate];//這句代碼用來終止timmer,不然,每過1.5秒,就會執行該方法一次,咱們是要在開始的時候執行一次就夠了。
}
 
/******************************************************************************
三、每隔0.8秒執行timeCount方法:
NSTimer*countTimer;
countTimer= [NSTimerscheduledTimerWithTimeInterval: 0.8target: selfselector: @selector(timeCount:)  userInfo: nilrepeats: YES];   
[countTimerfire];     //執行timer
******************************************************************************/
/******************************************************************************
四、延遲1秒執行test方法:
[selfperformSelector:@selector(test) withObject:nilafterDelay:0.1];
******************************************************************************/
/******************************************************************************
五、啓動線程:
[NSThreaddetachNewThreadSelector:@selector(transImage) toTarget:selfwithObject:nil]; 
timer=[NSTimerscheduledTimerWithTimeInterval:0.03target:selfselector:@selector(TimerClock:) userInfo:nilrepeats:YES]; //啓動一個NSTimer執行廣播
[timerfire];  //執行timer

-(void)TimerClock:(id)sender
{
//控制延遲觸發
if(Timecontrol>1) {   
[timerConditionbroadcast];      //廣播,觸發處於等待狀態的timerCondition

}

-(void)transImage

isRunning=YES;
while (countTime < COUNTTIME) {
[timerConditionwait];
lim += 255 / (2 * KFrame);
[selfprocessImage];
countTime += 1000 / KFrame;
}
[timerinvalidate];
isRunning=NO;
}

/************************************************************************************************************************************************************
7文件、文件夾操做
//若是"/Documents/Theme"路徑不存在,則建立。
if(![[NSFileManagerdefaultManager]fileExistsAtPath:themePath])
{
[[NSFileManagerdefaultManager] createDirectoryAtPath:themePath attributes:nil];
}
//刪除已存在的同名文件夾
if([[NSFileManagerdefaultManager] fileExistsAtPath:savePath]) {
[[NSFileManagerdefaultManager] removeItemAtPath:savePath error:NULL];
}
************************************************************************************************************************************************************/
/************************************************************************************************************************************************************
7 子線程拋給主線程:
[selfperformSelectorOnMainThread:@selector(shiftView) withObject:nilwaitUntilDone:YES];

************************************************************************************************************************************************************/
/************************************************************************************************************************************************************
8獲取當前時間
NSDateFormatter*formatter = [[NSDateFormatteralloc] init];
[formatter setDateFormat:@"yyyy-MM-dd hh:mm:ss"];
NSString *locationString=[formatter stringFromDate: [NSDate date]];

//獲取當前時間做爲productId
NSDateFormatter*formatter = [[NSDateFormatteralloc] init];
[formatter setDateFormat:@"hhmmss"];
NSString *locationString=[formatter stringFromDate: [NSDate date]];
downloadInfo.productId = locationString;
[formatter release];
/******************************************************************************
 函數名稱  : getDate
函數描述  : 獲取當前日期時間
 輸入參數  : N/A
 輸出參數  : N/A
 返回值    : NSString 當前時間
 備註     :
 ******************************************************************************/
-(NSString *)getDate
{
NSDateFormatter*formatter = [[NSDateFormatteralloc] init];
[formatter setDateFormat:@"yyyy-MM-dd EEEE HH:mm:ss a"];
NSString *locationString=[formatter stringFromDate: [NSDate date]];
[formatter release];
return locationString;
}
大寫的H日期格式將默認爲24小時制,小寫的h日期格式將默認爲12小時
不須要特別設置,只須要在dataFormat裏設置相似"yyyy-MMM-dd"這樣的格式就能夠了
日期格式以下:
y  年  Year  1996; 96  
M  年中的月份  Month  July; Jul; 07  
w  年中的週數  Number  27  
W  月份中的週數  Number  2  
D  年中的天數  Number  189  
d  月份中的天數  Number  10  
F  月份中的星期  Number  2  
E  星期中的天數  Text  Tuesday; Tue  
a  Am/pm 標記  Text  PM  
H  一天中的小時數(0-23)  Number  0  
k  一天中的小時數(1-24)  Number  24  
K  am/pm 中的小時數(0-11)  Number  0  
h  am/pm 中的小時數(1-12)  Number  12  
m  小時中的分鐘數  Number  30  
s  分鐘中的秒數  Number  55  
S  毫秒數  Number  978  
z  時區  General time zone  Pacific Standard Time; PST; GMT-08:00  
Z  時區  RFC 822 time zone  -0800
************************************************************************************************************************************************************/
/************************************************************************************************************************************************************
讀取和寫入plist文件

plist文件是標準的xml文件,在cocoa中能夠很簡單地使用。這裏介紹一下使用方法: 如下代碼在Mac和iPhone中均適用。 
寫入plist文件: NSMutableDictionary * dict = [ [ NSMutableDictionary alloc ] initWith 
  
plist文件是標準的xml文件,在cocoa中能夠很簡單地使用。這裏介紹一下使用方法:    
   
如下代碼在Mac和iPhone中均適用。
   
寫入plist文件:  
NSMutableDictionary* dict = [ [ NSMutableDictionaryalloc ] initWithContentsOfFile:@"/Sample.plist"];
[ dict setObject:@"Yes"forKey:@"RestartSpringBoard"];
[ dict writeToFile:@"/Sample.plist"atomically:YES];
   
讀取plist文件:
   
NSMutableDictionary* dict =  [ [ NSMutableDictionaryalloc ] initWithContentsOfFile:@"/Sample.plist"];
NSString* object = [ dict objectForKey:@"RestartSpringBoard" ];
************************************************************************************************************************************************************/
 UIView翻轉效果實現


新建一個view-based模板工程,在ViewController文件中添加下面的代碼,便可實現翻轉效果;

- (void)viewDidLoad {
     [super viewDidLoad];
//須要翻轉的視圖

UIView *parentView = [[UIView alloc] initWithFrame:CGRectMake(0, 150, 320, 200)];
parentView.backgroundColor = [UIColor yellowColor];
parentView.tag = 1000;

[self.view addSubview:parentView];
}

//須要在h頭文件聲明下面的動做響應函數
//在xib文件中添加一個button,其響應函數爲下面的函數
//運行程序後,點擊button就看到翻轉效果
-(IBAction)ActionFanzhuan{


//獲取當前畫圖的設備上下文
CGContextRef context = UIGraphicsGetCurrentContext();

//開始準備動畫
[UIView beginAnimations:nil context:context];

//設置動畫曲線,翻譯不許,見蘋果官方文檔 
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];

//設置動畫持續時間
[UIView setAnimationDuration:1.0];



//由於沒給viewController類添加成員變量,因此用下面方法獲得viewDidLoad添加的子視圖
UIView *parentView = [self.view viewWithTag:1000];

//設置動畫效果

[UIView setAnimationTransition: UIViewAnimationTransitionCurlDown forView:parentView cache:YES];  //從上向下
// [UIView setAnimationTransition: UIViewAnimationTransitionCurlUp forView:parentView cache:YES];   //從下向上
// [UIView setAnimationTransition: UIViewAnimationTransitionFlipFromLeft forView:parentView cache:YES];  //從左向右
// [UIView setAnimationTransition: UIViewAnimationTransitionFlipFromRight forView:parentView cache:YES];//從右向左


//設置動畫委託

[UIView setAnimationDelegate:self];

//當動畫執行結束,執行animationFinished方法
[UIView setAnimationDidStopSelector:@selector(animationFinished:)];

//提交動畫
[UIView commitAnimations];

}

//動畫效果執行完畢
- (void) animationFinished: (id) sender{
NSLog(@"animationFinished !");
}

運行程序,點擊按鈕,就能看到動畫效果了
iPhone 實現動畫效果
iPhone中實現動畫,主要有兩種方式:UIView的動畫塊和Core Animation的CATransition類。

讓一個UIImageView響應點擊事件
UIImageView *imgView =[[UIImageView alloc] initWithFrame:CGRectMake(0, 0,320, 44)];
imgView.userInteractionEnabled=YES;
UITapGestureRecognizer *singleTap =[[UITapGestureRecognizer alloc]initWithTarget:selfaction:@selector(onClickImage)];
[imgView addGestureRecognizer:singleTap];
[singleTap release];
-(void)onClickImage{
   // here, do whatever you wantto do
    NSLog(@"imageview is clicked!");
}
iphone調用系統電話、瀏覽器、地圖、郵件等
openURL的使用方法:
view plain copy toclipboard print ?
       [[UIApplication sharedApplication] openURL:[NSURL URLWithString:appString]];  
其中系統的appString有:
view plain copy toclipboard print ?
1.Map     http://maps.google.com/maps?q=Shanghai  
2.Email  mailto://myname@google.com  
3.Tel    tel://10086  
4.Msg    sms://10086  
openURL能幫助你運行Maps,SMS,Browser,Phone甚至其餘的應用程序。這是Iphone開發中我常常須要用到的一段代碼,它僅僅只有一行而已。
- (IBAction)openMaps {
    //打開地圖 
   NSString*addressText = @"beijing";
    //@"1Infinite Loop, Cupertino, CA 95014"; 
   addressText =[addressTextstringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding]; 
   NSString*urlText = [NSStringstringWithFormat:@"http://maps.google.com/maps?q=%@",addressText]; 
   NSLog(@"urlText=============== %@", urlText);
   [[UIApplicationsharedApplication] openURL:[NSURL URLWithString:urlText]];
}

- (IBAction)openEmail {
     //打開mail // Fire off an email to apple support
      [[UIApplication sharedApplication]openURL:[NSURL   URLWithString:@"mailto://devprograms@apple.com"]];
 } 
 
- (IBAction)openPhone {
  
    //撥打電話
    // CallGoogle 411
    [[UIApplication sharedApplication] openURL:[NSURLURLWithString:@"tel://8004664411"]];
 } 
 
- (IBAction)openSms {
    //打開短信
     // Text toGoogle SMS
    [[UIApplication sharedApplication] openURL:[NSURLURLWithString:@"sms://466453"]];
}

-(IBAction)openBrowser {
    //打開瀏覽器
    // Lanuch any iPhone developers fav site
     [[UIApplication sharedApplication] openURL:[NSURLURLWithString:@"http://itunesconnect.apple.com"]];
 }
iphone程序內調用谷歌地圖

使用CLLocationManager類,MKMapView。而且實現<MKMapViewDelegate,CLLocationManagerDelegate>
//初始化CLLocationManager,CLLocationManager得到當前地理座標
locmanager=[[CLLocationManager alloc]init];

[locmanager setDelegate:self];
 //設置精確度
[locmanager setDesiredAccuracy:kCLLocationAccuracyBest];

[locmanagerstartUpdatingLocation];
執行完之後,會自動調用代理方法:

在代理方法:


- (void)locationManager:(CLLocationManager *)managerdidUpdateToLocation:(CLLocation*)newLocation fromLocation:(CLLocation *)oldLocation{
//初始化矩形大小
 CGRect rect=CGRectMake(0,0,320,460);
//設置地圖大小爲矩形大小
map=[[MKMapView alloc] initWithFrame:rect];

CLLocationCoordinate2Dloc=[newLocation coordinate];
lat=loc.latitude;
lon=loc.longitude;

//coordinate座標
CLLocationCoordinate2DtheCoordinate;
CLLocationCoordinate2DtheCenter;

//theCoordinate.latitude=lat;
//theCoordinate.longitude=lon;
theCoordinate=loc;
[map setDelegate:self];
//設置地圖顯示的類型,有衛星地圖,道路,等
[map setMapType:MKMapTypeStandard];
//[mapsetMapType:MKMapTypeSatellite];
//區域座標Region(區域,地域)

MKCoordinateRegiontheRegin;
//theCenter.latitude=lat;
//theCenter.longitude=lon;
theCenter=loc;
theRegin.center=theCenter;

//座標間距(span:間隔,間距)
MKCoordinateSpantheSpan;

theSpan.latitudeDelta=0.1;
theSpan.longitudeDelta=0.1;
//設置地圖顯示的區域,
theRegin.span=theSpan;
//[mapsetRegion:theRegin];
[map regionThatFits:theRegin];
map.showsUserLocation=YES;
[self.viewaddSubview:map];

}


- (MKAnnotationView *)mapView:(MKMapView *)mapViewviewForAnnotation:(id<MKAnnotation>)annotation{
NSLog(@"-------viewForAnnotation-------");
//此類能夠顯示針同樣的圖標
MKPinAnnotationView*newAnnotation=[[MKPinAnnotationViewalloc] initWithAnnotation:annotationreuseIdentifier:@"annotation1"];

//newAnnotation.animatesDrop=YES;
//newAnnotation.animatesDrop=NO;

newAnnotation.pinColor=MKPinAnnotationColorPurple;
//顯示標誌提示
newAnnotation.canShowCallout=YES;
return newAnnotation;
}

iPhone電子書toolbar的實現
iPhone電子書的toolbar通常都設計成半透明,上面放置一個進度條和一個Label(用於顯示頁碼),這裏用代碼作一個最基本的實現。
生成一個UIToolbar
UIToolbar *toolbar =[[[UIToolbar alloc] init] autorelease];
toolbar.barStyle=UIBarStyleBlackTranslucent;
[toolbar sizeToFit];
CGFloat toolbarHeight =[toolbar frame].size.height;
CGRect rootViewBounds =self.parentViewController.view.bounds;
CGFloat rootViewHeight =CGRectGetHeight(rootViewBounds);
CGFloat rootViewWidth =CGRectGetWidth(rootViewBounds);
CGRect rectArea = CGRectMake(0, rootViewHeight-toolbarHeight,rootViewWidth, toolbarHeight);
[toolbar setFrame:rectArea];
toolbar.backgroundColor= [UIColor clearColor];
生成一個Slider

UISlider*readSlider =[[[UISlideralloc]initWithFrame:CGRectMake(0,0, 225,30)] autorelease];
readSlider.minimumValue = 0.0f;
readSlider.maximumValue = 1.0f;
readSlider.continuous = YES;
readSlider.enabled = YES;
生成一個Label

UILabel*readLabel =[[[UILabelalloc]initWithFrame:CGRectMake(230,0, 50,30)] autorelease];
readLabel.backgroundColor = [UIColor clearColor];
readLabel.textColor =[UIColor whiteColor];
Slider和Label加入到toolbar中

NSMutableArray *tbitems =[NSMutableArray array];
[tbitems addObject:[[[UIBarButtonItem alloc]initWithCustomView:readSlider] autorelease]];
[tbitems addObject:[[[UIBarButtonItemalloc] initWithCustomView:readLabel]autorelease]]; 
toolbar.items = tbitems;
toolbar加入到當前view中 
[self.navigationController.view addSubview:toolbar];
點擊屏幕即隱藏的功能,將toolbar的hidden屬性置爲YES便可

toolBar.hidden = YES;
 
iOS開發_iphone開發_iphone界面如何實現下拉列表
   
代碼以下:
     
    #import <UIKit/UIKit.h>
    @interface DropDownList : UIView<UITableViewDelegate,UITableViewDataSource> {
    UITextField* textField;   //文本輸入框
    NSArray* list;            //下拉列表數據
    BOOL showList;             //是否彈出下拉列表
    UITableView* listView;    //下拉列表
    CGRect oldFrame,newFrame;   //整個控件(包括下拉前和下拉後)的矩形
    UIColor *lineColor,*listBgColor;//下拉框的邊框色、背景色
    CGFloat lineWidth;               //下拉框邊框粗細
    UITextBorderStyle borderStyle;   //文本框邊框style
    }
    @property (nonatomic,retain)UITextField *textField;
    @property (nonatomic,retain)NSArray* list;
    @property (nonatomic,retain)UITableView* listView;
    @property (nonatomic,retain)UIColor *lineColor,*listBgColor;
    @property (nonatomic,assign)UITextBorderStyle borderStyle;
    -(void)drawView;
    -(void)setShowList:(BOOL)b;
    @end
    #import "DropDownList.h"
    @implementation DropDownList
    @synthesize textField,list,listView,lineColor,listBgColor,borderStyle;
    - (id)initWithFrame:(CGRect)frame {
     
    if(self=[super initWithFrame:frame]){
    //默認的下拉列表中的數據
    list=[[NSArray alloc]initWithObjects:@"1",@"2",@"3",@"4",nil];
     
    borderStyle=UITextBorderStyleRoundedRect;
     
    showList=NO; //默認不顯示下拉框
    oldFrame=frame; //未下拉時控件初始大小
    //當下拉框顯示時,計算出控件的大小。
    newFrame=CGRectMake(frame.origin.x, frame.origin.y, frame.size.width, frame.size.height*5);
     
    lineColor=[UIColor lightGrayColor];//默認列表邊框線爲灰色
    listBgColor=[UIColor whiteColor];//默認列表框背景色爲白色
    lineWidth=1;     //默認列表邊框粗細爲1
     
    //把背景色設置爲透明色,不然會有一個黑色的邊
    self.backgroundColor=[UIColor clearColor];
    [self drawView];//調用方法,繪製控件
     
    }
    return self;
    }
    -(void)drawView{
    //文本框
    textField=[[UITextField alloc]
      initWithFrame:CGRectMake(0, 0,
    oldFrame.size.width, 
    oldFrame.size.height)];
    textField.borderStyle=borderStyle;//設置文本框的邊框風格
    [self addSubview:textField];
        [textField addTarget:self action:@selector(dropdown) forControlEvents:UIControlEventAllTouchEvents]; 
     
    //下拉列表
    listView=[[UITableView alloc]initWithFrame:
      CGRectMake(lineWidth,oldFrame.size.height+lineWidth, 
    oldFrame.size.width-lineWidth*2,
    oldFrame.size.height*4-lineWidth*2)];
    listView.dataSource=self;
    listView.delegate=self;
    listView.backgroundColor=listBgColor;
    listView.separatorColor=lineColor;
    listView.hidden=!showList;//一開始listView是隱藏的,此後根據showList的值顯示或隱藏
     
    [self addSubview:listView]; 
    [listView release];
    }
    -(void)dropdown{
    [textField resignFirstResponder];
    if (showList) {//若是下拉框已顯示,什麼都不作
    return;
    }else {//若是下拉框還沒有顯示,則進行顯示
    //把dropdownList放到前面,防止下拉框被別的控件遮住
     
    [self.superview bringSubviewToFront:self];
    [self setShowList:YES];//顯示下拉框
    }
    }
    #pragma mark listViewdataSource method and delegate method
    -(NSInteger)tableView:(UITableView *)table numberOfRowsInSection:(NSInteger)section{
    return list.count;
    }
    -(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    static NSString *cellid=@"listviewid";
    UITableViewCell* cell=[tableView dequeueReusableCellWithIdentifier:cellid];
    if(cell==nil){
    cell=[[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault
      reuseIdentifier:cellid]autorelease];
    }
    //文本標籤
    cell.textLabel.text=(NSString*)[list objectAtIndex:indexPath.row];
    cell.textLabel.font=textField.font;
     
    cell.selectionStyle=UITableViewCellSelectionStyleGray;
    return cell;
    }
    -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    return oldFrame.size.height;
    }
    //當選擇下拉列表中的一行時,設置文本框中的值,隱藏下拉列表
    -(void)tableView:(UITableView *)tableViewdidSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    //NSLog(@"select");
    textField.text=(NSString*)[list objectAtIndex:indexPath.row];
    //NSLog(@"textField.text=%@",textField.text);
    [self setShowList:NO];
    }
    -(BOOL)showList{//setShowList:No爲隱藏,setShowList:Yes爲顯示
    return showList;
    }
    -(void)setShowList:(BOOL)b{
    showList=b;
    NSLog(@"showlist is set ");
    if(showList){
    self.frame=newFrame;
    }else {
    self.frame=oldFrame;
    }
    listView.hidden=!b;
    }
    /*
     
    // Only override drawRect: if you perform custom drawing.
    // An empty implementation adversely affects performance during animation.
    - (void)drawRect:(CGRect)rect {
        // Drawing code.
    }
    */
    - (void)dealloc {
        [super dealloc];
    }
    @end
create toolbar using new
  toolbar = [UIToolbar new];
  toolbar.barStyle = UIBarStyleDefault;
  [toolbar sizeToFit];
  toolbar.frame = CGRectMake(0, 410, 320, 50);
 
鍵盤透明
textField.keyboardAppearance = UIKeyboardAppearanceAlert;

狀態欄的網絡活動風火輪是否旋轉
[UIApplication sharedApplication].networkActivityIndicatorVisible,默認值是NO。

截取屏幕圖片
//建立一個基於位圖的圖形上下文並指定大小爲CGSizeMake(200,400)
UIGraphicsBeginImageContext(CGSizeMake(200,400)); 

//renderInContext 呈現接受者及其子範圍到指定的上下文
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];

 //返回一個基於當前圖形上下文的圖片
 UIImage *aImage = UIGraphicsGetImageFromCurrentImageContext();

 //移除棧頂的基於當前位圖的圖形上下文
UIGraphicsEndImageContext();

//以png格式返回指定圖片的數據
imageData = UIImagePNGRepresentation(aImage);

更改cell選中的背景
    UIView *myview = [[UIView alloc] init];
    myview.frame = CGRectMake(0, 0, 320, 47);
    myview.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"0006.png"]];
    cell.selectedBackgroundView = myview; 
iPhone鍵盤改變顏色
只有這2種數字鍵盤纔有效果:UIKeyboardTypeNumberPad,UIKeyboardTypePhonePad
keyboardAppearance = UIKeyboardAppearanceAlert 
代碼以下:
  1.    NSArray *ws = [[UIApplication sharedApplication] windows];
  2.     for(UIView *w in ws){
  3.         NSArray *vs = [w subviews];
  4.         for(UIView *v in vs){
  5.             if([[NSString stringWithUTF8String:object_getClassName(v)] isEqualToString:@"UIKeyboard"]){
  6.                 v.backgroundColor = [UIColor redColor];
  7.             }
  8.         }
  9.     }
從一個界面push到下一界面左上角返回按鈕文字設置
在父viewController中以下設置:
    UIBarButtonItem *backbutton = [[UIBarButtonItem alloc]init];
    backbutton.title = @"返回列表";
    self.navigationItem.backBarButtonItem = backbutton;
    [backbutton release];

防止屏幕暗掉鎖屏
[[UIApplication sharedApplication] setIdleTimerDisabled:YES];

將圖片從左到右翻頁效果顯示
 
    UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 0, 470)];
    [imageView setImage:[UIImage imageNamed:@"Bg.jpg"]];
    self.myImageView =imageView;
    [self.view addSubview:imageView];
    [imageView release];
    CGContextRef context = UIGraphicsGetCurrentContext();
    [UIView beginAnimations:nil context:context];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
    [UIView setAnimationDuration:0.5];
    [myImageView setFrame:CGRectMake(0, 0, 310, 470)];    
    [UIView commitAnimations];

讓覆蓋在下面層的視圖接受觸摸事件
searchImage.exclusiveTouch = YES;//第一層
searchImage.userInteractionEnabled = NO;
myMapView.exclusiveTouch = NO;//第二層
myMapView.userInteractionEnabled = YES;

View的縮放
NSValue *touchPointValue = [[NSValue valueWithCGPoint:CGPointMake(100,100)] retain];
[UIView beginAnimations:nil context:touchPointValue];
transform = CGAffineTransformMakeScale(0.1,0.21);
firstPieceView.transform = transform;
[UIView commitAnimations];    
點擊 UITextView 輸入文字,光標都從最初點開始
能讓用戶點擊 UITextView 輸入文字時,光標都從最初點開始
- (void)textViewDidChangeSelection:(UITextView *)textView
{
    NSRange range;
    range.location = 0;
    range.length  = 0;
    textView.selectedRange = range;
}



PS:UITextView有一個小BUG,若是其高度小於50的話,輸入的時候其光標會往上偏移,從而看不到光標,若是大於50就不會出現這個問題。
UITextView在光標處添加文字
// 得到光標所在的位置
int location =contentTextView.selectedRange.location;
// 將UITextView中的內容進行調整(主要是在光標所在的位置進行字符串截取,再拼接你須要插入的文字便可)
NSString *content = contentTextView.text;
NSString *result = [NSStringstringWithFormat:@"%@[姓名變量]%@",[contentsubstringToIndex:location],[contentsubstringFromIndex:location]];
// 將調整後的字符串添加到UITextView上面
contentTextView.text = result;
如何設置UITextView的光標位置
UITextView * m_textInput;
//設置光標到輸入文字的末尾
NSUInteger length = m_textInput.text.length;
m_textInput.selectedRange = NSMakeRange(length,0);                                    
UITextView方法 用法


UITextView限制行數的問題以前試了好多方法,最終解決了,解決方法很是簡單,在UITextViewDelegate中加下面的方法便可:
-(BOOL)textView:(UITextView *)textViewshouldChangeTextInRange:(NSRange)range
 replacementText:(NSString*)text {
  
   if (textView.contentSize.height > 104){
      textView.text = [textView.text substringToIndex:[textView.textlength]-1];
       returnNO;
   }


   return YES;
}

-(void)textViewDidChangeSelection:(UITextView*)textView 
每次輸入都知道

[textView becomeFirstResponder]

(void)textViewDidChange:(UITextView*)textView 當textView的內容發生改變時,會調用。。再此計算已經輸入的字符個數。

- (BOOL)textView:(UITextView*)textView shouldChangeTextInRange:(NSRange)rangereplacementText:(NSString *)text; {

if([@"\n" isEqualToString:text] == YES) {
  [textViewresignFirstResponder];
  returnNO;
  }
  returnYES;
}

- (BOOL)textView:(UITextView*)textView shouldChangeTextInRange:(NSRange)rangereplacementText:(NSString *)text;
textview根據光標插入數據  

UITableViewCell *cell =  [tableView cellForRowAtIndexPath:indexPath];
//定位光標

    NSRange range = [opinion selectedRange];
NSMutableString *top = [[NSMutableString alloc] initWithString:[opinion text]];
NSString *addName = [NSString stringWithFormat:@"%@、",cell.textLabel.text];
    [top insertString:addName atIndex:range.location];
    opinion.text = top;
    [top release];
用NStimer每隔必定時間刷新界面
NSTimer *addEnemyTimer;
addEnemyTimer=[NSTimer scheduledTimerWithTimeInterval:(3.0) target:self selector:@selector(addEnemy) userInfo:nil repeats:YES];


能夠嘗試使用一個單獨的線程來實現
多點觸摸:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
當一個或多個手指觸碰屏幕時,發送touchesBegan:withEvent:消息。 
當一個或多個手指在屏幕上移動時,發送touchesMoved:withEvent:消息。
當一個或多個手指離開屏幕時,發送touchesEnded:withEvent:消息。
iphone中的UITouch    
手指在屏幕上能達到的精度和鼠標指針有很大的不一樣。當用戶觸擊屏幕時,接觸
    區域其實是橢圓形的,並且比用戶想像的位置更靠下一點。根據觸摸屏幕的手指、手指的尺寸、手指接觸屏幕的力量、手指的方向、以及其它因素的不一樣,
其「接觸部位」的尺寸和形狀也有所不一樣。底層的多點觸摸系統會分析全部的這些信息,爲您計算出單一的觸點。

    UIResponder 是全部響應者對象的基類,
    它不只爲事件處理,並且也爲常見的響應者行爲定義 編程接口。UIApplication、UIView、和全部從UIView 派生出來的UIKit 類(包括UIWindow)都直接或間接地繼承自UIResponder類。

    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch* touch = [touches anyObject];
    NSUInteger numTaps = [touch tapCount];
    if (numTaps < 2) {
    [self.nextResponder touchesBegan:touches withEvent:event];
    } else {
    [self handleDoubleTap:touch];
    }
    }

    缺省狀況下,視圖會接收觸摸事件。可是,您能夠將其userInteractionEnabled
    屬性聲明設置爲NO,關閉事件傳遞的功能。

    在必定的時間內關閉事件的傳遞。應用程序能夠調用UIApplication 的
    beginIgnoringInteractionEvents 方法,並在隨後調用endIgnoringInteractionEvents 方法來實現這個目的。

    缺省狀況下,視圖只接收多點觸摸序列的第一個觸摸事件,而忽略
    全部其它事件。若是您但願視圖處理多點觸摸,就必須使它啓用這個功能。在代碼或Interface Builder 的查看器窗口中將視圖的multipleTouchEnabled 屬性設置爲YES,就能夠實現這個目標。
    將事件傳遞限制在某個單獨的視圖上。缺省狀況下,視圖的exclusiveTouch 屬性被設置爲NO。將這個屬性設置爲YES 會使相應的視圖具備這樣的特性:即當該視圖正在跟蹤觸摸動做時,窗口中的其它視圖沒法同時進行跟蹤,它們不能接收到那些觸摸事件。
    多點觸摸:
    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
    - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;
    - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;
    - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event

    當一個或多個手指觸碰屏幕時,發送touchesBegan:withEvent:消息。
    當一個或多個手指在屏幕上移動時,發送touchesMoved:withEvent:消息。
    當一個或多個手指離開屏幕時,發送touchesEnded:withEvent:消息。
    當觸摸序列被諸如電話呼入這樣的系統事件所取消時,發送touchesCancelled:withEvent:消息。
    上面這些方法都和特定的觸摸階段(好比UITouchPhaseBegan)相關聯,該信息存在於UITouch 對象的phase 屬性聲明中。
    爲了處理給定階段的事件,響應者對象經常從傳入的集合參數中取得一或多個UITouch 對象,而後考察這些對象的屬性或取得它們的位置(若是須要處理全部觸摸對象,能夠向該NSSet 對象發送anyObject 消息)。UITouch 類中有一個名爲locationInView:的重要方法,若是傳入self 參數值,它會給出觸摸動做在響應者座標系統中的位置(假定該響應者是一個UIView 對象,且傳入的視圖參數不爲nil)。另外,還有一個與之平行的方法,能夠給出觸摸動做以前位置(previousLocationInView:)。UITouch 實例的屬性還能夠給出發生多少次觸
    碰(tapCount)、觸摸對象的建立或最後一次變化發生在什麼時間(times*****p)、以及觸摸處於什麼階段(phase)。

    - (void) touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event
    {
    UITouch *touch = [touches anyObject];
    if ([touch tapCount] == 2) {
    CGPoint tapPoint = [theTouch locationInView:self];
    // Process a double-tap gesture
    }
    }
    在touchesEnded:withEvent:方法中,當觸擊次數爲一時,響應者對象就向自身發送一個performSelector:withObject:afterDelay:消息,其中的選擇器標識由響應者對象實現的、用於處理單擊手勢的方法;第二個參數是一個NSValue 或NSDictionary 對象,用於保存相關的UITouch 對象;時延參數則表示單擊和雙擊手勢之間的合理時間間隔。
    在touchesBegan:withEvent:方法中,若是觸擊次數爲二,響應者對象會向自身發送一個cancelPreviousPerformRequestsWithTarget:消息,取消當前被掛起和延期執行的調用。若是觸碰次數不爲二,則在指定的延時以後,先前步驟中由選擇器標識的方法就會被調用,以處理單擊手勢。
 
Iphone開發-NSRunLoop概述和原理
1.什麼是NSRunLoop?
咱們會常常看到這樣的代碼:

- (IBAction)start:(id)sender
{
pageStillLoading = YES;
[NSThread detachNewThreadSelector:@selector(loadPageInBackground:)toTarget:self withObject:nil];
[progress setHidden:NO];
while (pageStillLoading) {
[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
}
[progress setHidden:YES];
}
  這段代碼很神奇的,由於他會「暫停」代碼運行,並且程序運行不會由於這裏有一個while循環而受到影響。在[progress setHidden:NO]執行以後,整個函數像暫停了同樣,停在循環裏面,等loadPageInBackground裏面的操做都完成了之後,
才讓[progress setHidden:YES]運行。這樣作就顯得簡單,並且邏輯很清晰。若是不這樣作,就須要在loadPageInBackground裏面表示load完成的地方調用[progress setHidden:YES],顯得代碼不緊湊並且容易出錯。
那麼具體什麼是NSRunLoop呢?其實NSRunLoop的本質是一個消息機制的處理模式。若是你對vc++編程有必定了解,在windows中,有一系列很重要的函數SendMessage,PostMessage,GetMessage,
這些都是有關消息傳遞處理的API。可是在你進入到Cocoa的編程世界裏面,我不知道你是否是走的太快太匆忙而忽視了這個很重要的問題,Cocoa裏面就沒有說起到任何關於消息處理的API,
開發者歷來也沒有本身去關心過消息的傳遞過程,好像一切都是那麼天然,像大天然同樣天然?在Cocoa裏面你不再用去本身定義WM_COMMAD_XXX這樣的宏來標識某個消息,
也不用在switch-case裏面去對特定的消息作特別的處理。難道是Cocoa裏面就沒有了消息機制?答案是否認的,只是Apple在設計消息處理的時候採用了一個更加高明的模式,那就是RunLoop。
利用NSRunLoop阻塞NSOperation線程
使用NSOperationQueue簡化多線程開發中介紹了多線程的開發,我這裏主要介紹一下使用NSRunLoop阻塞線程。
主要使用在NStimer定時啓用的任務或者異步獲取數據的狀況如socket獲取網絡數據,要阻塞線程,直到獲取數據以後在釋放線程。
下面是線程中沒有使用NSRunLoop阻塞線程的代碼和執行效果:
線程類:
#import <Foundation/Foundation.h> 
@interface MyTask : NSOperation {     

@end
#import "MyTask.h" 
@implementation MyTask 
-(void)main     
{      
    NSLog(@"開始線程=%@",self);      
    [NSTimer timerWithTimeInterval:2 target:self selector:@selector(hiandeTime:) userInfo:nil repeats:NO];      
}      
-(void)hiandeTime:(id)sender      
{      
    NSLog(@"執行了NSTimer");      
}      
-(void)dealloc      
{      
    NSLog(@"delloc mytask=%@",self);      
    [super dealloc];      

@end
線程添加到隊列中:


- (void)viewDidLoad     
{      
    [super viewDidLoad];      
    NSOperationQueue *queue=[[NSOperationQueue alloc] init];      
    MyTask *myTask=[[[MyTask alloc] init] autorelease];      
    [queue addOperation:myTask];      
    MyTask *myTask1=[[[MyTask alloc] init] autorelease];      
    [queue addOperation:myTask1];      
    MyTask *myTask2=[[[MyTask alloc] init] autorelease];      
    [queue addOperation:myTask2];      
    [queue release];      
}
執行結果是:
2011-07-25 09:44:45.393 OperationDemo[20676:1803] 開始線程=<MyTask: 0x4b4dea0>   
2011-07-25 09:44:45.393 OperationDemo[20676:5d03] 開始線程=<MyTask: 0x4b50db0>    
2011-07-25 09:44:45.396 OperationDemo[20676:1803] 開始線程=<MyTask: 0x4b51070>    
2011-07-25 09:44:45.404 OperationDemo[20676:6303] delloc mytask=<MyTask: 0x4b4dea0>    
2011-07-25 09:44:45.404 OperationDemo[20676:5d03] delloc mytask=<MyTask: 0x4b50db0>    
2011-07-25 09:44:45.405 OperationDemo[20676:6303] delloc mytask=<MyTask: 0x4b51070>
能夠看到,根本沒有執行NSTimer中的方法,線程就釋放掉了,咱們要執行
NSTimer中的方法,就要利用NSRunLoop阻塞線程。下面是修改後的代碼:

-(void)main     
{      
    NSLog(@"開始線程=%@",self);      
    NSTimer *timer=[NSTimer timerWithTimeInterval:2 target:self selector:@selector(hiandeTime) userInfo:nil repeats:NO];      
    [timer fire];      
    while (!didDisconnect) {      
        [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];      
    }      
}
執行結果以下:
2011-07-25 10:07:00.543 OperationDemo[21270:1803] 開始線程=<MyTask: 0x4d16380>     
2011-07-25 10:07:00.543 OperationDemo[21270:5d03] 開始線程=<MyTask: 0x4d17790>      
2011-07-25 10:07:00.550 OperationDemo[21270:6303] 開始線程=<MyTask: 0x4d17a50>      
2011-07-25 10:07:00.550 OperationDemo[21270:1803] 執行了NSTimer      
2011-07-25 10:07:00.551 OperationDemo[21270:5d03] 執行了NSTimer      
2011-07-25 10:07:00.552 OperationDemo[21270:6303] 執行了NSTimer      
2011-07-25 10:07:00.556 OperationDemo[21270:6503] delloc mytask=<MyTask: 0x4d16380>      
2011-07-25 10:07:00.557 OperationDemo[21270:6303] delloc mytask=<MyTask: 0x4d17790>      
2011-07-25 10:07:00.557 OperationDemo[21270:5d03] delloc mytask=<MyTask: 0x4d17a50>
咱們可使用NSRunLoop進行線程阻塞。
ASIHTTPRequest 一款強大的HTTP包裝開源項目   
ASIHTTPRequest,是一個直接在CFNetwork上作的開源項目,提供了一個比官方更方便更強大的HTTP網絡傳輸的封裝。
特點功能以下:
1,下載的數據直接保存到內存或文件系統裏
2,提供直接提交(HTTP POST)文件的API
3,能夠直接訪問與修改HTTP請求與響應HEADER
4,輕鬆獲取上傳與下載的進度信息
5,異步請求與隊列,自動管理上傳與下載隊列管理機
6,認證與受權的支持
7,Cookie
8,請求與響應的GZIP
9,代理請求


下面來兩個小例子:
NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request start];
NSError *error = [request error];
if (!error) {
    NSString *response = [request responseString];
}

當你須要添加更多的請求信息時,如,添加個請求Header:
[request addRequestHeader:@"name" value:@"Jory lee"];

添加Post請求時的健值:
[request setPostValue:@"Ben" forKey:@"first_name"];
[request setPostValue:@"Copsey" forKey:@"last_name"];
[request setFile:@"/Users/ben/Desktop/ben.jpg" forKey:@"photo"];

設置HTTP的受權賬號:
[request setUsername:@"username"];
[request setPassword:@"password"];

一個異步請求:
- (IBAction)grabURLInBackground:(id)sender
{
NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setDelegate:self];
[request startAsynchronous];
}

- (void)requestFinished:(ASIHTTPRequest *)request
{
// Use when fetching text data
NSString *responseString = [request responseString];

// Use when fetching binary data
NSData *responseData = [request responseData];
}

- (void)requestFailed:(ASIHTTPRequest *)request
{
NSError *error = [request error];
}   

在咱們數據獲取的過程當中,若是數據源複雜,一個請求隊列是必不可少的:
- (IBAction)grabURLInTheBackground:(id)sender
{
if (![self queue]) {
[self setQueue:[[[NSOperationQueue alloc] init] autorelease]];
}

NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setDelegate:self];
[request setDidFinishSelector:@selector(requestDone:)];
[request setDidFailSelector:@selector(requestWentWrong:)];
[[self queue] addOperation:request]; //queue is an NSOperationQueue
}

- (void)requestDone:(ASIHTTPRequest *)request
{
NSString *response = [request responseString];
}

- (void)requestWentWrong:(ASIHTTPRequest *)request
{
NSError *error = [request error];
}   
ASIHTTPRequest使用介紹 SIHTTPRequest,是一個直接在CFNetwork上作的開源項目,提供了一個比官方更方便更強大的HTTP網絡傳輸的封裝。 1、介紹 特點功能以下: 1.下載的數據直接保存到內存或文件系統裏 2.提供直接提交(HTTP POST)文件的API 3.能夠直接訪問與修改HTTP請求與響應HEADER 4.輕鬆獲取上傳與下載的進度信息 5.異步請求與隊列,自動管理上傳與下載隊列管理機 6.認證與受權的支持 7.Cookie 8.請求與響應的GZIP 9.代理請求 ASIHTTPRequest -Main classes介紹: 1.ASIHTTPRequest:處理與服務器的基本交互,包括下載上傳,認證,cookies以及進度查看。 2.ASIFormDataRequest:是ASIHTTPRequest子類,主要處理post事件,它能使post更加簡單。 3.ASINetworkQueue:是NSOperationQueue子類,當處理多個請求時可使用,若是每次都是單個請求就沒必要使用。 4.ASIDownloadCache:該類容許ASIHTTPRequest從服務器傳遞cookie。 ASIHTTPRequest -Support classes介紹: 1.ASIInputStream:當使用ASIHTTPRequest上傳數據時使用,若是工程中用了ASIHTTPRequest,就必定要include這個類。 2.ASIAuthenticationDialog:該類容許ASIHTTPRequest鏈接到服務器時呈現登陸框。在全部iPhone OS工程中都要使用,Mac OS工程中能夠不用。 3.Reachability:相信不少人對這個類已經很熟悉了,當在你程序中偵測網絡狀態時它將很是有用。 ASIHTTPRequest -Protocols and configuration介紹: 1.ASIHTTPRequestDelegate:該協議指定了ASIHTTPRequest的delegate可能須要實現的方法,全部方法都是optional。 2.ASIProgressDelegate:該協議列出了uploadProgressDelegate和downloadProgressDelegate可能須要實現的方法,全部方法爲optional。 3.ASICacheDelegate:該協議指定了download cache必須實現的方法。若是你要寫你本身的download cache,確保實現required方法。 4.ASIHTTPRequestConfig.h:該文件定義了編譯時全部的全局配置選項。使用該文件中的方法能夠在控制檯中輸出request正在進行的任務.
相關文章
相關標籤/搜索