目前正在用unity做遊戲開發,需要調用IOS原生的相冊系統,擷取一張照片傳入unity,然後在unity中對照片進行旋轉,縮放等操作。因為對OC不熟悉,是以查了各種資料後發現UIImagePickerController可以實作從IOS中擷取照片。終于把接口弄好了,進行測試發現,擷取到照片後,在unity中竟然不支援多點觸摸了,是以也無法通過兩個手指對圖檔進行旋轉、縮放等操作。
經過多方面的測試發現,問題出現在oc中add的view竟然沒有清除掉。但是對于OC一點也不熟悉啊。查了多方資料發現使用removeFromSuperview移除掉Add的view,然後release掉UIImagePickerController,就可以實作清除掉添加的view,unity就可以正常多點觸摸了。
但是最近更新了unity至5.3.4版本了,當然以上是在unity4.7版本下。發現ARC開啟了,也就是說沒法自己release掉UIImagePickerController了。又各種查詢資料,發現了在添加view的同時,把control也添加上就ok了。
情況基本就是這樣,但是對OC不了解,走了很多彎路,記錄在這裡,也許以後就贻笑大方了。下面貼出代碼。
.h檔案
//
// IOSAlbumCameraController.h
//
// Created by wagnyanlei
//
//
@interface IOSAlbumCameraController : UIViewController<UIActionSheetDelegate,UIImagePickerControllerDelegate,UINavigationControllerDelegate>
@end
.mm檔案
//
// IOSAlbumCameraController.mm
//
// Created by wangyanlei
//
#import "IOSAlbumCameraController.h"
@implementation IOSAlbumCameraController
- (void)viewDidLoad
{
[super viewDidLoad];
// 此處修改view的背景顔色,不然看不來多了一個view
//self.view.backgroundColor = [UIColor darkGrayColor];
// 此處在view上添加一個按鈕
// UIButton *btn = [UIButton buttonWithType:UIButtonTypeSystem];
// [btn setFrame:CGRectMake(130, 100, 100, 100)];
// [btn setTitle:@"back" forState:UIControlStateNormal];
// [btn setBackgroundColor:[UIColor whiteColor]];
// [btn addTarget:self action:@selector(backMethod) forControlEvents:UIControlEventTouchUpInside];
// [self.view addSubview:btn];
}
- (void)showPicker:
(UIImagePickerControllerSourceType)type
allowsEditing:(BOOL)flag
{
NSLog(@"打開相冊選擇器!");
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.delegate = self;
picker.sourceType = type;
picker.allowsEditing = flag;
[self presentViewController:picker animated:YES completion:nil];
}
-(void) viewDidAppear:(BOOL)animated {
[super viewDidAppear:YES];
}
// 打開相冊後選擇照片時的響應方法
- (void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary*)info
{
NSLog(@" 完成照片選擇!");
// Grab the image and write it to disk
UIImage *image;
UIImage *image2;
image = [info objectForKey:UIImagePickerControllerOriginalImage];
UIGraphicsBeginImageContext(CGSizeMake(768,1024));
[image drawInRect:CGRectMake(0, 0, 768, 1024)];
image2 = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
// 得到了image,然後用你的函數傳回u3d
NSData *imgData;
if(UIImagePNGRepresentation(image2) == nil)
{
imgData= UIImageJPEGRepresentation(image, 1.0);
}
else
{
imgData= UIImagePNGRepresentation(image2);
}
NSString *_encodeImageStr = [imgData base64Encoding];
UnitySendMessage( "IOSAlbumCamera", "PickImageCallBack_Base64", _encodeImageStr.UTF8String);
// 關閉相冊
[picker dismissViewControllerAnimated:YES completion:nil];
}
// 打開相冊後點選“取消”的響應
- (void)imagePickerControllerDidCancel:(UIImagePickerController*)picker
{
NSLog(@" 關閉照片選擇器!");
[picker dismissViewControllerAnimated:YES completion:nil];
}
@end
//------------- called by unity -----begin-----------------
#if defined (__cplusplus)
extern "C" {
#endif
// 打開相冊
void _iosOpenPhotoLibrary()
{
if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary])
{
NSLog(@"初始打開!");
IOSAlbumCameraController * app = [[IOSAlbumCameraController alloc] init];
UIViewController *vc = UnityGetGLViewController();
// 添加ViewController
[vc addChildViewController:app];
// 添加view
[vc.view addSubview: app.view];
// 調用顯示相冊接口
[app showPicker:UIImagePickerControllerSourceTypePhotoLibrary allowsEditing:NO];
// 移除掉添加的view
[app.view removeFromSuperview];
}
else
{
UnitySendMessage( "IOSAlbumCamera", "PickImageCallBack_Base64", (@"").UTF8String);
}
}
#if defined (__cplusplus)
}
#endif
//------------- called by unity -----end-----------------
// 歡迎大家斧正。