Ronak
Ronak

Reputation: 165

open UIImagePickerController in landscape mode

I want to open iphone saved images in my application. my application working in landscape mode. when I trying to load all saved photo from iphone library using presentModalViewController method, it will open in portrait mode. I want that in landscape mode. here is the code:

picker = [[UIImagePickerController alloc] init];
picker.delegate = self;

picker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;
picker.allowsEditing = NO;
picker.navigationBarHidden = YES;
picker.wantsFullScreenLayout = YES;
[picker setNavigationBarHidden:TRUE];

[self presentModalViewController:picker animated:NO];
NSLog(@"%@", self.view.subviews);
[picker release];  

can any one help me.. Thanks in advance.

Upvotes: 3

Views: 11400

Answers (6)

Vaibhav Sharma
Vaibhav Sharma

Reputation: 1123

From the UIImagePickerController Class Reference.

Important: The UIImagePickerController class supports portrait mode only. This class is intended to be used as-is and does not support subclassing. The view hierarchy for this class is private and must not be modified, with one exception. You can assign a custom view to the cameraOverlayView property and use that view to present additional information or manage the interactions between the camera interface and your code.

Upvotes: 0

user2960625
user2960625

Reputation: 51

I have tried the code with some additions

[self.navigationController setNavigationBarHidden:YES];
[self addChildViewController:picker];
[self.view addSubview:picker.view];
picker.view.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
picker.view.frame = self.view.bounds;
[picker didMoveToParentViewController:self];


(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 
{
   UIImage *chosenImage = info[UIImagePickerControllerEditedImage];
   self.imageView.image = chosenImage;
   [picker.view removeFromSuperview];
   [picker removeFromParentViewController];
}


(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker 
{
   [picker.view removeFromSuperview];
   [picker removeFromParentViewController];
}

Upvotes: 2

Jerry101
Jerry101

Reputation: 13367

I tried this approach, while following the API docs more closely:

- (void)openEmbeddedImagePicker:(UIImagePickerController *)picker {
    [self.navigationController setNavigationBarHidden:YES];
    [self addChildViewController:picker];
    [self.view addSubview:picker.view];
    picker.view.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
    picker.view.frame = self.view.bounds;
    [picker didMoveToParentViewController:self];
}

But the video recorder's Cancel and playback buttons don't respond. Also, while the containing VC (self in the above method) restricts the orientation to landscape, rotating between the two landscape modes messes up the layout of the picker's overlay bar (on iOS 6, at least).

Does anyone have success restricting the video recorder to landscape mode?

Upvotes: 1

phani yelugula
phani yelugula

Reputation: 278

we cant get UIImagePickerController in landscape...

but we can get the images in our device into an array and display them in landscape mode and in portrait mode....itseems same like UIImagePickerController...

we should use ALAsset class and ALAssetsLibrary for this..

void (^assetEnumerator)(struct ALAsset *, NSUInteger, BOOL *) = ^(ALAsset *result, NSUInteger index, BOOL *stop)
{
    if(result != NULL) 
    {
        [assets addObject:result];
    }
};

void (^assetGroupEnumerator)(struct ALAssetsGroup *, BOOL *) =  ^(ALAssetsGroup *group, BOOL *stop) 
{
    if(group != nil)
    {
        [group enumerateAssetsUsingBlock:assetEnumerator];
    }
    [self meth];
    [activity stopAnimating];
    [activity setHidden:YES];
};
assets = [[NSMutableArray alloc] init];
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
[library enumerateGroupsWithTypes:ALAssetsGroupAlbum usingBlock:assetGroupEnumerator 
                     failureBlock: ^(NSError *error) { NSLog(@"Failure");}];

in viewDidLoad

-(void)meth
{
NSLog(@"%i",[assets count]);

if(userOrientation==UIInterfaceOrientationPortrait || userOrientation==UIInterfaceOrientationPortraitUpsideDown)
{
    NSLog(@"haii");
    [scrollView removeFromSuperview];

    scrollView=[[UIScrollView alloc]initWithFrame:CGRectMake(0, 0, 320, 460)];
    scrollView.backgroundColor=[UIColor whiteColor];

    NSLog(@"%i",[assets count]);
    for (int i = 0; i < [assets count]; i++) 
    {
        imgBtn = [UIButton buttonWithType:UIButtonTypeCustom];
        [imgBtn setFrame:CGRectMake((i%4*80)+2,(i/4*80)+2,75,75)];
        imgBtn.tag=i;
        [imgBtn addTarget:self action:@selector(imageClicked:) forControlEvents:UIControlEventTouchUpInside];
        ALAsset *asset=[assets objectAtIndex:i];
        [imgBtn setImage:[UIImage imageWithCGImage:[asset thumbnail]] forState:UIControlStateNormal];
        [scrollView addSubview:imgBtn];
    }
    scrollView.contentSize = CGSizeMake(320,(([assets count]/4)+1)*300 );
}

if(userOrientation==UIInterfaceOrientationLandscapeRight || userOrientation==UIInterfaceOrientationLandscapeLeft)
{
    [scrollView removeFromSuperview];
    scrollView=[[UIScrollView alloc]initWithFrame:CGRectMake(0, 0, 480,320)];
    for (int i = 0; i < [assets count]; i++) 
    {
        imgBtn = [UIButton buttonWithType:UIButtonTypeCustom];
        [imgBtn setFrame:CGRectMake((i%6*80)+2,(i/6*80)+2,75,75)];
        imgBtn.tag=i;
        [imgBtn addTarget:self action:@selector(imageClicked:) forControlEvents:UIControlEventTouchUpInside];
        ALAsset *asset=[assets objectAtIndex:i];
        [imgBtn setImage:[UIImage imageWithCGImage:[asset thumbnail]] forState:UIControlStateNormal];
        [scrollView addSubview:imgBtn];
    }
    scrollView.contentSize = CGSizeMake(480,(([assets count]/4)+1)*300);
}
[self.view addSubview:scrollView];
 }

Upvotes: 2

Ronak
Ronak

Reputation: 165

I used following code:

[self.view addSubview:imgPicker.view]; 
[imgPicker viewWillAppear:YES]; 
[imgPicker viewDidAppear:YES];

instead of using presentModalViewController method, [self presentModalViewController:picker animated:NO];

Upvotes: 1

Anomie
Anomie

Reputation: 94804

You can't. Quoth the documentation:

The UIImagePickerController class supports portrait mode only. This class is intended to be used as-is and does not support subclassing.

It's a bit more work, but you can use the AssetsLibrary framework to access the list of images and create your own image picker.

Upvotes: 4

Related Questions