On the iPad new ios 7 UIActionSheet is not correctly displayed with lots of buttons.
Not cleaning background of UIActionSheet on scrolling. The buttons seem frozen in background UIActionSheet.
screenshot with problem
My code :
UIActionSheet *popupQuery = [[UIActionSheet alloc];
for (int i=0; i<[ParamAllList count]; i++)
{
NSMutableDictionary *Param = [ParamAllList objectAtIndex:i];
[popupQuery addButtonWithTitle:[Param valueForKey:@"name"]];
[[[popupQuery valueForKey:@"_buttons"] objectAtIndex:[[popupQuery valueForKey:@"_buttons"] count]-1] setImage:[UIImage imageNamed:@"add40icon.png"] forState:UIControlStateNormal];
}
popupQuery.actionSheetStyle = UIActionSheetStyleAutomatic;
[popupQuery showFromRect:Button_Settings.frame inView:Button_Settings.superview animated:YES];
This was my workaround for the actionSheet delegate:
- (void)willPresentActionSheet:(UIActionSheet *)actionSheet {
actionSheet.backgroundColor = [UIColor whiteColor];
for (UIView *subview in actionSheet.subviews) {
subview.backgroundColor = [UIColor whiteColor];
}
}
Based off of this answer:
Change Text color in UIActionSheet Buttons
Funny thing - this bug still exists in iOS 7.1beta4 :)
And doesn't appear in iPhone implementation, only iPad...
And its origin is quite strange - "blurry" effect is showing when an UIActionSheet has so many items, so it have to put these in an UITableView like container, but unfortunately this view container is put twice (and it isn't the same instance).
So we need to leave only one and remove others.
Antoher thing we need to correct is the UITableView height.
Below my fix - to implement in UIActionSheetDelegate -(void)willPresentActionSheet:
#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)
- (void)willPresentActionSheet:(UIActionSheet *)actionSheet {
if( SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0") ) {
if( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad ) {
// fix for iOS7 iPad UIActionSheet presentation when content need to scroll
// and scrolled view appears with unnecessary copies, remove not needed ones
// and set proper tableview height too
int count = 0;
for (UIView *subview in actionSheet.subviews) {
if( [subview isMemberOfClass:[UIView class]] ) {
if( ++count == 1 ) {
// process only first view
for( UIView *subsubview in subview.subviews ) {
if( [subsubview isKindOfClass:[UITableView class]] ) {
// fix table view height
UITableView *tableView = (UITableView*)subsubview;
CGRect tableViewFrame = tableView.frame;
tableViewFrame.size.height -= subview.frame.origin.y;
tableView.frame = tableViewFrame;
}
}
} else {
// remove unnecessary view
[subview removeFromSuperview];
}
}
}
}
}
}