轉載自: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
代碼以下:
- NSArray *ws = [[UIApplication sharedApplication] windows];
- for(UIView *w in ws){
- NSArray *vs = [w subviews];
- for(UIView *v in vs){
- if([[NSString stringWithUTF8String:object_getClassName(v)] isEqualToString:@"UIKeyboard"]){
- v.backgroundColor = [UIColor redColor];
- }
- }
- }
從一個界面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正在進行的任務.