目前正在用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
//
// IOSAlbumCameraController.mm
//
// Created by wangyanlei
//
#import "IOSAlbumCameraController.h"
@implementation IOSAlbumCameraController
- (void)viewDidLoad
{
[superviewDidLoad];
// 此处修改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 = [[UIImagePickerControlleralloc] init];
picker.delegate =self;
picker.sourceType = type;
picker.allowsEditing = flag;
[selfpresentViewController:pickeranimated:YEScompletion:nil];
}
-(void) viewDidAppear:(BOOL)animated {
[superviewDidAppear: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 = [imgDatabase64Encoding];
UnitySendMessage("IOSAlbumCamera", "PickImageCallBack_Base64", _encodeImageStr.UTF8String);
// 关闭相册
[picker dismissViewControllerAnimated:YEScompletion:nil];
}
// 打开相册后点击“取消”的响应
- (void)imagePickerControllerDidCancel:(UIImagePickerController*)picker
{
NSLog(@"关闭照片选择器!");
[picker dismissViewControllerAnimated:YEScompletion:nil];
}
@end
//------------- called by unity -----begin-----------------
#if defined (__cplusplus)
extern "C" {
#endif
// 打开相册
void _iosOpenPhotoLibrary()
{
if([UIImagePickerControllerisSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary])
{
NSLog(@"初始打开!");
IOSAlbumCameraController * app = [[IOSAlbumCameraControlleralloc] init];
UIViewController *vc =UnityGetGLViewController();
// 添加ViewController
[vc addChildViewController:app];
// 添加view
[vc.viewaddSubview: app.view];
// 调用显示相册接口
[app showPicker:UIImagePickerControllerSourceTypePhotoLibraryallowsEditing:NO];
// 移除掉添加的view
[app.viewremoveFromSuperview];
}
else
{
UnitySendMessage("IOSAlbumCamera", "PickImageCallBack_Base64", (@"").UTF8String);
}
}
#if defined (__cplusplus)
}
#endif
//------------- called by unity -----end-----------------
// 欢迎大家斧正。