Can Poyrazoğlu
Can Poyrazoğlu

Reputation: 34780

UIDocumentInteractionController not appearing on iPad but working on iPhone

I'm trying to display a UIDocumentInteractionController on my app. Everything is working perfectly on iPhone, but nothing is happening on iPad. Here is my code:

    interactionController = [UIDocumentInteractionController interactionControllerWithURL:imageFile];
    interactionController.UTI = @"com.instagram.photo";
    interactionController.annotation = [NSDictionary dictionaryWithObject:[self commentForInstagram] forKey:@"InstagramCaption"];
    [interactionController presentOpenInMenuFromRect:self.view.frame inView:self.view animated:YES];

interactionController is a strong reference to an instance, and imageFile exists. On iPhone, it brings up the 'Open With..' dialog and Instagram is present. On iPad, absolutely nothing happens when the above code runs. Yes, I do have Instagram installed and working on my iPad.

What could be the reason that nothing is happening when the code is executed? self.view and self.view.frame are valid objects (tested on debug).

Thanks, Can.

Upvotes: 3

Views: 6975

Answers (6)

trapper
trapper

Reputation: 11993

presentOptionsMenuFromRect:inView: - This is talking about where the popover arrow points.

The view is the view that the arrow points at, and the rect is the rect inside the view that the arrow points at.

Once you understand that this is easy.

- (void)shareClick:(UIButton*)sender
{
   /*some code*/
   [interactionController presentOptionsMenuFromRect:sender.bounds inView:sender animated:YES];
}

So now the arrow will point to an edge of the bounds of the button.

Most of the time this is what you want but you could for example inset this rect to have the arrow point inside the button.

Upvotes: 0

rimes
rimes

Reputation: 921

I had the same issue. I checked the frame that is being passed and saw that x and y are set to 0. Next I tried to change those values (by keeping width and height as passed) and the popup showed up. Here the code:

-(void)openDocument:(UIView*)senderView {

   CGRect rectForAppearing = [senderView convertRect:senderView.frame toView:senderView];

   if (isIPAD)
     rectForAppearing =  CGRectMake(100, 100, rectForAppearing.size.width, rectForAppearing.size.height);

   [interactionController presentOptionsMenuFromRect:rect inView:self.view animated:YES];

}

The popup appears on an Ipad in the top right corner. You can of course twist those 100,100 parameters to your desire. On iPhones i leave the popover as is (at the bottom)

Upvotes: -1

Raginmari
Raginmari

Reputation: 2529

I had the same problem earlier today.

First of all, do not pass the frame of your view to presentOptionsMenuFromRect:inView:animated. The given rect is supposed to be in the coordinates of the view. The frame of the view is in the coordinates of the view's superview.

On iPhone, passing the bounds of the view worked, but on iPad, Xcode (7.2.1) would complain about unsatisfiable constraints and not display the document interaction controller's view (DIC).

Instead of the bounds, I tried to pass CGRectZero as the first parameter which anchors the DIC in the upper left corner of the view. This works but it looks bad.

In order to position the DIC at the center of the bottom edge of the view, you can specify a rect of size CGSizeZero positioned at the center of the bottom edge of the view (use the view's bounds to compute the position). This works and looks ok.

Upvotes: 1

Vlad
Vlad

Reputation: 3571

For iPad you have to meet these 2 things:

  1. Define area for DocumentActionMenu

    CGRect rect = CGRectMake(0.0, 0.0, 0.0, 0.0);

    [interactionController presentOpenInMenuFromRect:rect inView:self.view animated:YES];

  2. Use iPad, not simulator

Upvotes: 4

manggit
manggit

Reputation: 204

Use presentOptionsMenuFromRect:inView:animated:.

For example, if you want the menu to be presented from the bottom, try

[interactionController presentOptionsMenuFromRect:self.view.bounds inView:self.view animated:YES];

Upvotes: 3

Vaskravchuk
Vaskravchuk

Reputation: 145

On iPad UIDocumentInteractionController appearing like Pop Up Try something like this:

-(void)shareClick:(UIButton*)sender {
   /*some code*/
   CGRect rectForAppearing = [sender.superview convertRect:sender.frame toView:self.view];
   [interactionController presentOptionsMenuFromRect:rect inView:self.view animated:YES];
}

Upvotes: 7

Related Questions