UIActionSheet cancel button strange behaviour

IosObjective CIphoneCocoa TouchUiactionsheet

Ios Problem Overview


I have a UIBarButtonItem opening an action sheet to offer users choices about what to do. Everything works as expected unless I try to click on the "Cancel" button. The target of the button appears to have moved up from where it should be. I can only activate it by clicking somewhere in the middle of the "Cancel" and "Ok" buttons.

I've tried at action sheets in other applications and they work fine, so it's not just my big thumb. The action sheet is opening in a UIViewController

- (void)showOpenOptions
{
    UIActionSheet *sheet = [[UIActionSheet alloc] 
	initWithTitle:NSLocalizedString(@"Open link in external application?", @"Open in external application")
	delegate:self
	cancelButtonTitle:NSLocalizedString(@"Cancel", @"Cancel")
	destructiveButtonTitle:NSLocalizedString(@"Open Link", @"Open Link")
	otherButtonTitles:nil];

    [sheet showInView:self.view];
    [sheet release];
}

Ios Solutions


Solution 1 - Ios

Instead of passing the current view controller's view to the action sheet, use the showFromTabBar: method of UIActionSheet.

The Right Way
This will give the correct tappable area:

[actionSheet showFromTabBar:self.tabBarController.tabBar];

The Wrong Way
This will put the tappable area in the wrong place (if you're using a tab bar or toolbar):

[actionSheet showInView:self.view];

If you're using a toolbar, use the showFromToolbar: method instead. You'll need a reference to the toolbar, most likely an ivar

[actionSheet showFromToolbar:self.myToolbar];

My Old Answer Also works, but is hacky:

Just found a possible answer:

> 01-Dec-2008 10:22 PM Tom Saxton: I looked at this bug some more, and it seems to be an issue with the tabbar.

>If you call UIActionSheet's [sheet showInView:self.view] from a view controller that is a child of a UITabViewController, then the hit testing on the cancel button fails in that portion of the UIActionSheet that lies above the tabbar's view.

>If you instead pass in the UITabBarController's view, then the UIActionSheet acts as expected.

>NOTE: in iPhone OS 2.1 and earlier, the UIActionSheet came up from the top of the tab bar when you pass the child view, but in 2.2, it comes up from the bottom of the tab bar, and thus covers the tab view.

http://openradar.appspot.com/6410780

Edit: It works correctly when I change the view to be the tab bar's view

[sheet showInView:self.parentViewController.tabBarController.view];

Solution 2 - Ios

I found an answer over here that works.

using: [filterActionSheet showInView:[self.view window]];

i tried a few ways to get to my tab bar and they way this app is set up it seem convoluted...

Solution 3 - Ios

Instead use:

[sheet showFromTabBar:theTabBar];

Solution 4 - Ios

Here is the fix.Try this:

[actionsheet showInView:[UIApplication sharedApplication].keyWindow];

Solution 5 - Ios

I think a combination of three of the answers is the right way of handling this:

	[actionSheet showFromTabBar:self.tabBarController.tabBar];

i.e., use showFromTabBar (that's why it exists) and you don't need the parentViewController as Nathan pointed out (in fact, self.parentViewController.tabBarController.tabBar returns nil for me.

Solution 6 - Ios

FYI - had the same problem with UIDocumentInteractionController's actionsheet stepping on the tabbar. Used the following to fix.

UIViewController *parentView = [[self parentViewController] parentViewController];
[docController presentOptionsMenuFromRect: rect inView: parentView.view animated:YES];

Solution 7 - Ios

write simplite code

 actionSheet.actionSheetStyle = UIActionSheetStyleDefault;

this work fine

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionnevan kingView Question on Stackoverflow
Solution 1 - Iosnevan kingView Answer on Stackoverflow
Solution 2 - IosdriveguyView Answer on Stackoverflow
Solution 3 - IosCorey FloydView Answer on Stackoverflow
Solution 4 - IosViggneshView Answer on Stackoverflow
Solution 5 - IosRawMeanView Answer on Stackoverflow
Solution 6 - IosMickeyView Answer on Stackoverflow
Solution 7 - Iosjayesh kavathiyaView Answer on Stackoverflow