天天看點

關于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-----------------

// 歡迎大家斧正。

繼續閱讀