UIActionSheet在iOS 7 GM的最后一个项目上没有显示分隔符
这可能是iOS7上的一个错误。 但是最后一个button并没有与前一个button分开
正如你可以从图像中看到的。 这在使用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上工作,以最简单的方式:
- 只有用标题初始化UIActionSheet
- 添加你的button
- 最后添加一个“取消”button
- 将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号。