demo程式已經上傳,需要5個資源分,沒有資源分的,在評論中留下郵箱,我會發給你的,歡迎下載修改和交流! demo下載連結地址
這一篇博文講述發微博介面的實現。
首先我們先瞭解一下在這個發微博介面中需要做哪些事情吧!
(1) 發微博包括文字內容和微博圖片,所以我們可以用一個textview來裝載微博文字內容,用一個imageview來裝載圖片內容。
①在文字部分,用一個textview,在發送的時候檢測一下發送文字的個數,如果超過140,那麼給出提示資訊。在圖片部分,用一個imageview,並且如果添加了圖片,那麼在圖片的右上方添加一個打叉的按鈕,作用是去除圖片;當然,在你沒有選擇添加圖片或者取消了已選圖片時,按鍵自動取消。效果如:
這個打叉的cancelButton的處理比較簡單,代碼如下:
- (IBAction)cancelImage:(id)sender { _cancelButton.hidden = YES; self.theImageView.image = [UIImage imageNamed:@"noImage50x118.png"];}
在導覽列的右邊添加一個發送按鍵,處理相關的發送資訊。代碼如下:
- (IBAction)sendWeibo:(id)sender { [self.theTextView resignFirstResponder]; NSString *content = [[NSString alloc] initWithString:_theTextView.text]; //計算髮送微博的內容字數,並作相應的處理 NSInteger contentLength = content.length; if (contentLength > 140) { MBProgressHUD *overLengthHud = [[MBProgressHUD alloc] initWithView:self.view]; [self.view addSubview:overLengthHud]; overLengthHud.mode = MBProgressHUDModeText; overLengthHud.labelText = @"提示資訊"; overLengthHud.detailsLabelText = [NSString stringWithFormat:@"微博字數:%d 超過140上限!",contentLength]; [overLengthHud show:YES]; [overLengthHud hide:YES afterDelay:2]; } else { UIImage *image = _theImageView.image; //沒有圖片 if (!hasPostImage) { [self postWithText:content]; } //有圖片 else { [self postWithText:content image:image]; } hud = [[MBProgressHUD alloc] init]; hud.dimBackground = YES; hud.labelText = @"正在發送..."; [hud show:YES]; [self.view addSubview:hud]; }}
注意到其中的方法 -(void) postWithText:(NSString*)text 是發單純文字微博的,而方法 -(void)postWithText:(NSString *)text image:(UIImage*)image 是發文字+圖片微博的。具體的實現過程下面會講解。
修改:突然發現其實上面的發送代碼中還存在一個小問題,假如其中不輸入文字也可以發送,顯然這是不對的。那麼還有添加一個if判斷一下字數長度是否為0,如果是0的話給出一個alert視窗提示一下。
if (contentLength == 0) { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil message:@"請輸入微博內容!" delegate:nil cancelButtonTitle:@"好" otherButtonTitles:nil, nil]; [alert show]; } else if (contentLength > 140) { } else { }
②這裡要著重說的是如何添加圖片。
這裡用一個按鍵用於插入圖片。
插入的圖片來源包括系統相簿和拍攝。
在這裡我們需要用到UIImagePickerController 類來建立映像選取器。UIImagePickerController 映像選取器是一種導航控制器類,讓你可以在應用程式中添加簡單的映像選擇功能或者照相機介面。使用者會看到一個映像選擇螢幕,在其中挑選相片,相片的來源則是他自己的相片庫、儲存下來的相片集或者照相機。當使用者選定一個相片後,就會通過 UIImagePickerDelegate 協議中的方法,通知選取器的委託方法實現映像的選取。
The role and appearance of an image picker controller depend on the source type you assign to it before you present it.
A sourceType of UIImagePickerControllerSourceTypeCamera provides a user interface for taking a new picture or movie (on devices that support media capture).
A sourceType of UIImagePickerControllerSourceTypePhotoLibrary or UIImagePickerControllerSourceTypeSavedPhotosAlbum provides a user interface for choosing among saved pictures and movies.
這裡說明了通過sourceType 設定映像的來源。包括
enum{
UIImagePickerControllerSourceTypePhotoLibrary,//相片庫
UIImagePickerControllerSourceTypeCamera,//照相機
UIImagePickerControllerSourceTypeSavedPhotosAlbum//儲存的相片
};
typedef NSUInteger UIImagePickerControllerSourceType;
Verify that the device is capable of picking content from the desired source. Do this calling the isSourceTypeAvailable: class method, providing a constant from the “UIImagePickerControllerSourceType” enumeration.
在使用時應先檢查當前裝置是否支援使用UIImagePickerController,這個時候我們需要調用isSourceTypeAvailable:方法判斷,需要提供sourceType 作為參數
當使用者選擇一個圖片之後,選取器的委託會通過 didFinishPickingImage 方法接到通知。代理會得到一個包含有該映像的 UIImage 對象,如果編輯功能開啟的話,還會得到一個包含了編輯屬性的NSDictionary。
使用UIImagePickerController的時候注意添加這兩個delegate,<UIImagePickerControllerDelegate,UINavigationControllerDelegate>並實現其中的兩個方法。
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
設定選取器的delegate ,就可以將一個委託賦予選取器:picker.delegate =self;
在這裡我們需要實現下面的這個第一個方法,這樣當選取一個映像時,委託類就會得到通知,在這個方法中添加影像處理的有關代碼就可以實現對選取圖片的處理。
添加圖片這部分的代碼如下:
- (IBAction)addPhoto:(id)sender { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil message:@"插入圖片" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"系統相簿",@"拍攝", nil]; [alert show]; } #pragma mark - UIAlertViewDelegate - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { if (buttonIndex == 1) { [self addPhoto]; } else if(buttonIndex == 2) { [self takePhoto]; } } - (void)addPhoto { UIImagePickerController * imagePickerController = [[UIImagePickerController alloc]init]; imagePickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; imagePickerController.delegate = self; imagePickerController.allowsEditing = NO; [self presentModalViewController:imagePickerController animated:YES]; } - (void)takePhoto { if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil message:@"該裝置不支援拍照功能" delegate:nil cancelButtonTitle:nil otherButtonTitles:@"好", nil]; [alert show]; } else { UIImagePickerController * imagePickerController = [[UIImagePickerController alloc]init]; imagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera; imagePickerController.delegate = self; imagePickerController.allowsEditing = NO; [self presentModalViewController:imagePickerController animated:YES]; } } #pragma mark - UIImagePickerControllerDelegate - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { [picker dismissModalViewControllerAnimated:YES]; UIImage * image = [info objectForKey:@"UIImagePickerControllerOriginalImage"]; self.theImageView.image = image; hasPostImage = YES; _cancelButton.hidden = NO; }
(1) 發微博需要用到的API調用;如果只是發文字微博的話,是用到這個API:https://api.weibo.com/2/statuses/update.json;如果是發文字+圖片微博的話,用到的是這個API:https://upload.api.weibo.com/2/statuses/upload.json。注意到二者的HTTP請求都是POST;而且請求參數中也要做一點出來,文字的話必須做URLencode,內容不超過140個漢字;圖片的話,需要是binary類型的,而且僅支援JPEG 、GIF 、PNG格式,圖片大小小於5M。
這部分資料請求的處理我用到了ASIHTTPRequest這個第三方類庫。
處理的代碼如下:
//發布文字微博 -(void) postWithText:(NSString*)text { NSURL *url = [NSURL URLWithString:WEIBO_UPDATE]; ASIFormDataRequest *item = [[ASIFormDataRequest alloc] initWithURL:url]; [item setPostValue:[InfoForSina returnAccessTokenString] forKey:@"access_token"]; [item setPostValue:text forKey:@"status"]; [item setCompletionBlock:^{ self.theTextView.text = nil; [hud removeFromSuperview]; MBProgressHUD *custuonHUD = [[MBProgressHUD alloc]initWithView:self.view]; custuonHUD.customView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"37x-Checkmark.png"]]; custuonHUD.labelText = @"發微博成功!"; custuonHUD.mode = MBProgressHUDModeCustomView; [self.view addSubview:custuonHUD]; [custuonHUD show:YES]; [custuonHUD hide:YES afterDelay:1]; }]; [item startAsynchronous]; } //發布文字圖片微博 -(void)postWithText:(NSString *)text image:(UIImage*)image { NSURL *url = [NSURL URLWithString:WEIBO_UPLOAD]; ASIFormDataRequest *item = [[ASIFormDataRequest alloc] initWithURL:url]; [item setPostValue:[InfoForSina returnAccessTokenString] forKey:@"access_token"]; [item setPostValue:text forKey:@"status"]; [item addData:UIImagePNGRepresentation(image) forKey:@"pic"]; [item setCompletionBlock:^{ self.theImageView.image = [UIImage imageNamed:@"noImage50x118.png"]; self.theTextView.text = nil; [hud removeFromSuperview]; _cancelButton.hidden = NO; MBProgressHUD *custuonHUD = [[MBProgressHUD alloc]initWithView:self.view]; custuonHUD.customView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"37x-Checkmark.png"]]; custuonHUD.labelText = @"發微博成功!"; custuonHUD.mode = MBProgressHUDModeCustomView; [self.view addSubview:custuonHUD]; [custuonHUD show:YES]; [custuonHUD hide:YES afterDelay:1]; }]; [item startAsynchronous]; }
使用時需要#import "ASIFormDataRequest.h"
有兩點需要說明的是:
1、前面已經說到文字內容需要URLencode,在這裡我麼並沒有做什麼處理,因為我們使用的這個第三方類庫已經幫我們實現了;對於微博圖片內容,必須轉換成binary現實,我們是這樣處理的:UIImagePNGRepresentation(image)
NSData * UIImagePNGRepresentation (
UIImage *image
);
Returns the data for the specified image in PNG format
2、在發送完成的block中我們對textview和imagview都做了處理,方便發送下一條微博;同時我添加了一個提示框提示發送成功的資訊,在這個提示框中我使用了customView,也就是打鉤的image。如下。
好了,大概就這樣說完了!