おそらくiOS7のバグかもしれません。しかし、最後のボタンは前のボタンから分離されていません
画像からわかるように。これは、シミュレータと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にはキャンセルボタンが必要だと思うので、キャンセルボタンのタイトルを追加できます。
もう1つの方法は、actionSheetのcancelButtonIndexを指定することです。
たとえば、あなたのケースでは、インデックス4のotherButtonTitlesに「Cancel」を追加して、actionSheetを指定できます。 .cancelButtonIndex = 4。
私はそれをiPhoneとiPadで最も簡単な方法で機能させる方法を見つけました:
セパレーターの欠落は、キャンセルボタンが最初に追加されたとき、またはinitを介して追加されたときに別のケースとして認識されなかったことが原因であると思います。
初期化が機能した後、空の文字列でキャンセルボタンを追加することがわかりました。キャンセルボタンは表示されず、セパレーターが表示されます。
[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;
}];
シートを下にシフトして、キャンセルボタンを画面から非表示にします
最も簡単な修正は、割り当て時に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];
キャンセルボタンがある場合、最後の行が表示されます。それは私が現在使用している一時的な修正です。キャンセルボタンを表示したくない場合は、解決策がわからない
initWithTitle:delegate:cancelButtonTitle:destructiveButtonTitle:otherButtonTitles:メソッドはバグが多いようで、キャンセルボタンをここで指定しないでください。ところで、その方法で設定された破壊的なボタンもあまり機能しないようです。
代わりに、次のことを行う必要があります。
["Action 1", "Action 2", "Close"]
_またはsheet.addButtonWithTitle("Close")
sheet.cancelButtonIndex = 2
_その後、すべてが期待どおりに動作します。 iPadではボタンが自動的に非表示になり、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];
}
}
すべてのボタンの高さは44です。私のactionSheetにはタイトルがありません。そして、2番目と3番目のボタンの間にセパレータを追加したかったのです。だから88番を使っています。