UIActionSheet在iOS 7 GM的最后一个项目上没有显示分隔符

这可能是iOS7上的一个错误。 但是最后一个button并没有与前一个button分开 UIActionSheet缺少最后一个按钮上的分隔符

正如你可以从图像中看到的。 这在使用iOS7 GM的模拟器和设备上都会发生。 其他人是否也有同样的问题?

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

正如你所看到的代码很简单。 任何想法如何解决这个问题? 或者我可以使用一些第三方库来代替UIActionSheet?

我认为ActionSheet 需要一个取消button。所以你可以添加取消button标题。

另一种方法是:指定actionSheet的cancelButtonIndex。

例如,在你的情况下,你可以在索引4的otherButtonTitles中添加一个“ Cancel ”,然后指定actionSheet.cancelButtonIndex = 4。

我find了一种方法,使其在iPhone和iPad上工作,以最简单的方式:

  1. 只有用标题初始化UIActionSheet
  2. 添加你的button
  3. 最后添加一个“取消”button
  4. 将CancelButtonIndex设置为最后一个索引

我认为丢失的分隔符是由取消button不被认为是一个单独的情况下,首先添加或通过初始化。

我发现初始化后添加一个空string取消button。 取消button不会显示,分隔符显示。

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

但是这只适用于iPad。 在iPhone上,显示一个空的取消button,但我发现一个hacky的解决方法,使其工作。 除了上面,在willPresentActionSheet添加此代码:

 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; }]; 

这将向下移动工作表以隐藏屏幕上的取消button

最简单的解决方法是在分配过程中将@""传递给取消button标题而不是nil

 UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:@"Title" delegate:self cancelButtonTitle:@"" // change is here destructiveButtonTitle:nil otherButtonTitles:@"First", @"Second", @"Third", @"Fourth", nil]; [actionSheet showInView:self.view]; 
 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]; 

如果你有一个取消button,最后一行将被显示。 这是我现在使用的临时修复程序。 不知道任何解决scheme,如果你不想要取消button来显示

看来, initWithTitle:委托:cancelButtonTitle:destructiveButtonTitle:otherButtonTitles:方法是越野车,你不应该在这里指定任何取消button。 顺便说一下,这种方法设置的破坏性button似乎也不能很好地工作。

而不是你应该:

  • 提供一个自定义取消button作为button数组中的最后一个button,例如: ["Action 1", "Action 2", "Close"]sheet.addButtonWithTitle("Close")
  • 手动设置取消button索引,例如sheet.cancelButtonIndex = 2

那么一切都会按预期工作。 在iPad上,button将被自动隐藏,并在iPhone上以正确的方式进行样式化和放置。

  - (void)willPresentActionSheet:(UIActionSheet *)actionSheet { if ([UIDevice currentDevice].systemVersion.floatValue < 8.0f) { UIView *separator = [[UIView alloc] initWithFrame:CGRectMake(8, 88, actionSheet.frame.size.width - 16, 0.5)]; separator.backgroundColor = [UIColor colorWithRed:219.0f/255 green:219.0f/255 blue:223.0f/255 alpha:1]; [actionSheet addSubview:separator]; } } 

每个button都有高度44.我的actionSheet没有标题。 我想在第二个和第三个button之间添加分隔符。 这就是为什么我使用88号。