Il pourrait s'agir probablement d'un bug sur iOS7. Mais le dernier bouton n'est pas séparé du précédent
Comme vous pouvez le voir sur l'image. Cela se produit à la fois sur le simulateur et sur le périphérique utilisant iOS7 GM . Est-ce que tout le monde a le même problème?
UIActionSheet *actionSheet = [[UIActionSheet alloc]
initWithTitle:@"Title"
delegate:self
cancelButtonTitle:nil
destructiveButtonTitle:nil
otherButtonTitles:@"First", @"Second", @"Third", @"Fourth", nil];
[actionSheet showInView:self.view];
Comme vous pouvez le constater, le code est assez simple… .. Une idée sur la façon de résoudre le problème? Ou une bibliothèque tierce que je peux utiliser à la place de UIActionSheet?
Je pense que ActionSheet nécessite un bouton d'annulation. Vous pouvez donc ajouter le titre du bouton d'annulation.
Une autre méthode consiste à: spécifier le paramètre cancelButtonIndex d’actionSheet.
Par exemple, dans votre cas, vous pouvez ajouter un " Cancel " dans otherButtonTitles à l'index 4, puis spécifiy actionSheet.cancelButtonIndex = 4.
J'ai trouvé un moyen de le faire fonctionner sur iPhone et iPad de la façon la plus simple possible:
Je suppose que le séparateur manquant est dû au fait que le bouton d'annulation n'a pas été reconnu comme un cas séparé lors de l'ajout initial ou via l'init.
J'ai trouvé que l'ajout d'un bouton d'annulation avec une chaîne vide après l'initialisation fonctionne. Le bouton d'annulation n'apparaît pas et le séparateur apparaît.
[sheet addButtonWithTitle: @""];
[sheet setCancelButtonIndex: sheet.numberOfButtons - 1];
Mais cela ne fonctionne que pour iPad. Sur l'iPhone, un bouton d'annulation vide apparaît, mais j'ai trouvé une solution de contournement pour le faire fonctionner. En plus de ce qui précède, dans willPresentActionSheet
, ajoutez ce code dans:
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;
}];
Cela abaisse la feuille pour masquer le bouton d'annulation de l'écran
Le correctif le plus simple consiste à passer @""
au titre du bouton d'annulation au lieu de nil
lors de l'attribution.
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];
Si vous avez un bouton d'annulation, la dernière ligne sera affichée. C'est le correctif temporaire que j'utilise maintenant. Je ne connais aucune solution si vous ne voulez pas qu'un bouton d'annulation apparaisse
Il semble que la méthode initWithTitle: delegate: cancelButtonTitle: destructiveButtonTitle: otherButtonTitles: est incorrecte et que vous ne devriez spécifier aucun bouton d'annulation ici. Btw, il semble qu'un bouton destructif défini dans cette méthode ne fonctionnera pas très bien non plus.
Au lieu de cela, vous devriez:
["Action 1", "Action 2", "Close"]
ou sheet.addButtonWithTitle("Close")
sheet.cancelButtonIndex = 2
Ensuite, tout fonctionnera comme prévu. Sur l'iPad, le bouton sera automatiquement masqué et sur l'iPhone, il sera stylé et placé correctement.
- (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];
}
}
Chaque bouton a la hauteur 44. Mon actionSheet n'a pas de titre. Et je voulais ajouter un séparateur entre les deuxième et troisième boutons. C'est pourquoi j'utilise le numéro 88.