UIActionSheet is not showing separator on the last item on iOS 7 GM

Solution 1:

I think ActionSheet requires a cancel button.So you can add the cancel button title.

Another way is: Specify actionSheet's cancelButtonIndex.

For example,in your case, you can add a "Cancel" in otherButtonTitles at index 4 and then specifiy actionSheet.cancelButtonIndex = 4.

Solution 2:

I found a way to make it work on iPhone and iPad in the least hacky way:

  1. Only init the UIActionSheet with a title
  2. Add your buttons
  3. Add a "CANCEL" button at last
  4. set the CancelButtonIndex to that last index

I assume that the missing separator is caused by the cancel button not being recognized as a separate case when adding it first or through the init.

Solution 3:

I found that adding a cancel button with an empty string after initialization works. The cancel button won't show up and the separator shows up.

[sheet addButtonWithTitle: @""];
[sheet setCancelButtonIndex: sheet.numberOfButtons - 1];

But this only works for iPad. On iPhone, an empty cancel button shows up, but I found a hacky workaround to make it work. In addition to the above, in willPresentActionSheet add this code in:

NSInteger offset = 55;
CGRect superFrame = actionSheet.superview.frame;
superFrame.origin.y += offset;
[actionSheet.superview setFrame: superFrame];

// hide underlay that gets shifted with the superview
[(UIView*)[[actionSheet.superview subviews] objectAtIndex: 0] removeFromSuperview];

// create new underlay
CGRect underlayFrame = CGRectMake(0, -offset, superFrame.size.width, superFrame.size.height);
UIView* underlay = [[UIView alloc] initWithFrame: underlayFrame];
underlay.alpha = 0.0f;
[underlay setBackgroundColor: [UIColor colorWithWhite: 0.0f alpha: 0.4f]];
[actionSheet.superview insertSubview: underlay atIndex: 0];

// simulate fade in
[UIView animateWithDuration: 0.3f animations:^{
    underlay.alpha = 1.0f;
}];

This shifts down the sheet to hide the cancel button off the screen

Solution 4:

The simplest fix is to pass @"" to the cancel button title instead of nil during allocation.

UIActionSheet *actionSheet = [[UIActionSheet alloc]
               initWithTitle:@"Title"
               delegate:self
               cancelButtonTitle:@"" // change is here
               destructiveButtonTitle:nil
               otherButtonTitles:@"First", @"Second", @"Third", @"Fourth", nil];
[actionSheet showInView:self.view];

Solution 5:

UIActionSheet *asAccounts = [[UIActionSheet alloc]
                            initWithTitle:Localized(@"select_an_account")
                            delegate:self
                            cancelButtonTitle:nil
                            destructiveButtonTitle:nil
                            otherButtonTitles: nil];

for (int i=0; i<[result count]; i++) {
    ACAccount *acct = [result objectAtIndex:i];
    [asAccounts addButtonWithTitle:[acct username]];
    asAccounts.tag = i;
}

[asAccounts addButtonWithTitle:Localized(@"Cancel")];                
asAccounts.cancelButtonIndex = result.count;
[asAccounts showInView:self.view];