web-dev-qa-db-fra.com

UIActionSheet n'affiche pas le séparateur sur le dernier élément sous iOS 7 GM

Il pourrait s'agir probablement d'un bug sur iOS7. Mais le dernier bouton n'est pas séparé du précédentUIActionSheet is missing separator on the last button

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?

46
Punty

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.

24
Yiding

J'ai trouvé un moyen de le faire fonctionner sur iPhone et iPad de la façon la plus simple possible: 

  1. Initiez uniquement la feuille UIAction avec un titre
  2. Ajoutez vos boutons
  3. Ajouter enfin un bouton "ANNULER"
  4. définir le CancelButtonIndex sur ce dernier index

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.

8
teebot

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 

6
Chris

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];
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

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

1
user2773279

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:

  • fournissez un bouton d'annulation personnalisé comme dernier bouton du tableau de boutons, par exemple: ["Action 1", "Action 2", "Close"] ou sheet.addButtonWithTitle("Close")
  • définir manuellement l'index du bouton d'annulation, par ex. 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.

0
Dmitry Sokurenko
    - (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. 

0
user3202661