天天看点

关于Unity3D(4.7和5.3.4)与IOS原生Object-C交互,调用IOS原生UIImagePickerController的问题

目前正在用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-----------------

// 欢迎大家斧正。

继续阅读