46

这可能是iOS7上的一个错误。但是最后一个按钮并没有与上一个按钮分开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 ?

4

8 回答 8

24

我认为 ActionSheet需要一个取消按钮。因此您可以添加取消按钮标题。

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

例如,在您的情况下,您可以在索引 4 处的 otherButtonTitles 中添加“取消”,然后指定 actionSheet.cancelButtonIndex = 4。

于 2013-10-04T19:44:22.537 回答
8

我找到了一种方法让它以最简单的方式在 iPhone 和 iPad 上运行:

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

我假设缺少的分隔符是由于取消按钮在第一次添加或通过 init 添加时未被识别为单独的情况引起的。

于 2014-04-28T01:11:01.873 回答
6

我发现在初始化后添加一个带有空字符串的取消按钮是可行的。取消按钮不会出现,而分隔符会出现。

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

但这仅适用于 iPad。在 iPhone 上,出现了一个空的取消按钮,但我找到了一个 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;
}];

这会向下移动工作表以将取消按钮隐藏在屏幕之外

于 2013-11-07T19:22:59.410 回答
5

最简单的解决方法是传递@""给取消按钮标题,而不是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];
于 2014-03-21T18:02:50.757 回答
3
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];
于 2013-10-06T11:15:29.807 回答
1

如果您有取消按钮,将显示最后一行。这就是我现在使用的临时修复。如果您不想显示取消按钮,不知道任何解决方案

于 2013-09-30T16:02:14.313 回答
0

似乎initWithTitle:delegate:cancelButtonTitle: destroyButtonTitle:otherButtonTitles:方法有问题,您根本不应该在此处指定任何取消按钮。顺便说一句,似乎在该方法中设置的破坏性按钮也不会很好地工作。

取而代之的是,您应该:

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

然后一切都会按预期工作。在 iPad 上,该按钮将自动隐藏,在 iPhone 上,它将以正确的方式设置样式和放置。

于 2015-01-21T12:24:24.783 回答
0
    - (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];
    }
}

每个按钮的高度为 44。我的 actionSheet 没有标题。我想在第二个和第三个按钮之间添加分隔符。这就是我使用 88 号的原因。

于 2015-04-28T13:09:45.663 回答