web-dev-qa-db-ja.com

UIActionSheetがiOS 7の最後のアイテムにセパレーターを表示しないGM

おそらくiOS7のバグかもしれません。しかし、最後のボタンは前のボタンから分離されていませんUIActionSheet is missing separator on the last 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の代わりに使用できるサードパーティのライブラリですか?

46
Punty

ActionSheetにはキャンセルボタンが必要だと思うので、キャンセルボタンのタイトルを追加できます。

もう1つの方法は、actionSheetのcancelButtonIndexを指定することです。

たとえば、あなたのケースでは、インデックス4のotherButtonTitlesに「Cancel」を追加して、actionSheetを指定できます。 .cancelButtonIndex = 4。

24
Yiding

私はそれをiPhoneとiPadで最も簡単な方法で機能させる方法を見つけました:

  1. タイトル付きのUIActionSheetのみを初期化します
  2. ボタンを追加する
  3. 最後に「キャンセル」ボタンを追加
  4. cancelButtonIndexを最後のインデックスに設定します

セパレーターの欠落は、キャンセルボタンが最初に追加されたとき、またはinitを介して追加されたときに別のケースとして認識されなかったことが原因であると思います。

8
teebot

初期化が機能した後、空の文字列でキャンセルボタンを追加することがわかりました。キャンセルボタンは表示されず、セパレーターが表示されます。

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

ただし、これはiPadでのみ機能します。 iPhoneでは、空のキャンセルボタンが表示されますが、それを機能させるためのハックな回避策を見つけました。上記に加えて、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;
}];

シートを下にシフトして、キャンセルボタンを画面から非表示にします

6
Chris

最も簡単な修正は、割り当て時に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];
5
aha
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];
3
nesimtunc

キャンセルボタンがある場合、最後の行が表示されます。それは私が現在使用している一時的な修正です。キャンセルボタンを表示したくない場合は、解決策がわからない

1
user2773279

initWithTitle:delegate:cancelButtonTitle:destructiveButtonTitle:otherButtonTitles:メソッドはバグが多いようで、キャンセルボタンをここで指定しないでください。ところで、その方法で設定された破壊的なボタンもあまり機能しないようです。

代わりに、次のことを行う必要があります。

  • ボタン配列の最後のボタンとしてカスタムのキャンセルボタンを提供します。例:_["Action 1", "Action 2", "Close"]_またはsheet.addButtonWithTitle("Close")
  • キャンセルボタンのインデックスを手動で設定します。 _sheet.cancelButtonIndex = 2_

その後、すべてが期待どおりに動作します。 iPadではボタンが自動的に非表示になり、iPhoneでは適切な方法でスタイル設定および配置されます。

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にはタイトルがありません。そして、2番目と3番目のボタンの間にセパレータを追加したかったのです。だから88番を使っています。

0
user3202661