web-dev-qa-db-fra.com

UIAlertView addSubview dans iOS7

L'ajout de contrôles à UIAlertView était obsolète dans iOS7 à l'aide de la méthode addSubview. Comme je le sais Apple a promis d’ajouter la propriété contentView.

iOS 7 est disponible maintenant et je constate que cette propriété n'est pas ajoutée. C'est pourquoi je recherche une solution personnalisée avec la possibilité d'ajouter une barre de progression à cet alertView. Quelque chose par exemple similaire à TSAlertView , mais plus prêt à être utilisé dans iOS 7 .

67
B.S.

Voici un projet sur Github d'ajouter n'importe quel UIView à un dialogue ressemblant à UIAlertView sur iOS7.

(Copié à partir de ce thread StackOverflow .)

Custom iOS7 AlertView dialog

55
Wimagguc

Il ne m'a fallu qu'un jour pour créer ma propre vue d'alerte qui ressemble exactement à celle d'Apple.

  1. Prenez une capture d'écran de l'alerte Apple à titre de référence (tailles de police, espacements, largeur)
  2. Créez une bibliothèque xib avec un titre, un message, une vue personnalisée et des tableaux pour les boutons (Apple utilise maintenant des tableaux au lieu de UIButton, la cellule de tableau par défaut est suffisante). Notez que vous avez besoin de 3 tableaux de boutons: deux pour les boutons gauche et droit (chaque fois que le nombre de boutons est égal à 2), un autre pour les autres cas (un bouton ou plus de 2 boutons).
  3. Implémentez toutes les méthodes de UIAlertView sur votre alerte personnalisée.

  4. Show/Dismiss (Afficher/Ignorer): vous pouvez créer une fenêtre modale spécifique pour vos alertes, mais je viens de placer mes alertes au-dessus de mon contrôleur de vue racine. Enregistrez vos alertes visibles sur un tableau statique. Si vous affichez la première alerte/ignorez la dernière, changez le mode de teinte de votre contrôleur de fenêtre/vue sur gradué/sur automatique et ajoutez/supprimez une vue de gradation (noir avec alpha = 0,2).

  5. Arrière-plan flou - utilisez l'exemple de code d'Apple (j'ai utilisé du blanc opaque)
  6. Effets dynamiques 3D - utilisez l'exemple de code Apple (5 lignes de code). Si vous voulez un effet Nice, prenez un instantané légèrement plus gros à l'étape 5 et ajoutez des animateurs inverses pour l'arrière-plan et le premier plan d'alerte.

MODIFIER:

Vous trouverez à la fois l'arrière-plan flou et l'exemple de code d'effet de paralaxe dans l'exemple de code "iOS_RunningWithASnap" WWDC 2013.

Effet Paralax:

UIInterpolatingMotionEffect* xAxis = [[[UIInterpolatingMotionEffect alloc] initWithKeyPath:@"center.x"
                                                                                     type:UIInterpolatingMotionEffectTypeTiltAlongHorizontalAxis] autorelease];
xAxis.minimumRelativeValue = [NSNumber numberWithFloat:-10.0];
xAxis.maximumRelativeValue = [NSNumber numberWithFloat:10.0];

UIInterpolatingMotionEffect* yAxis = [[[UIInterpolatingMotionEffect alloc] initWithKeyPath:@"center.y"
                                                                                     type:UIInterpolatingMotionEffectTypeTiltAlongVerticalAxis] autorelease];
yAxis.minimumRelativeValue = [NSNumber numberWithFloat:-10.0];
yAxis.maximumRelativeValue = [NSNumber numberWithFloat:10.0];

UIMotionEffectGroup *group = [[[UIMotionEffectGroup alloc] init] autorelease];
group.motionEffects = @[xAxis, yAxis];
[self addMotionEffect:group];

Le fond flou est la seule chose compliquée. Si vous pouvez utiliser une couleur opaque à la place, utilisez-la. Sinon, c'est beaucoup d'expérimentation. Notez également que l’arrière-plan flou n’est pas une bonne solution lorsque l’arrière-plan est sombre.

Pour le spectacle/renvoyer animationg, j'utilise la nouvelle méthode d'animation de printemps:

void (^animations)() = ^{
    self.alpha = 1.0f;
    self.transform = CGAffineTransformIdentity;
};

self.alpha = 0.0f;
self.transform = CGAffineTransformMakeScale(0.5f, 0.5f);

[UIView animateWithDuration:0.3
                      delay:0.0
     usingSpringWithDamping:0.7f
      initialSpringVelocity:0.0f
                    options:UIViewAnimationOptionCurveLinear
                 animations:animations
                 completion:^(BOOL completed) {
                         //calling UIAlertViewDelegate method
                     }];
35
Sulthan

J'ai écrit une implémentation complète d'UIAlertView qui imite l'API UIAlertView complète, mais ajoute la propriété contentView que nous recherchions tous depuis si longtemps: SDCAlertView .

image

32
Scott Berrevoets

Pour ceux qui aiment les méthodes simples et efficaces sans avoir à écrire des lignes de code. Voici une solution intéressante sans utiliser d’autres travaux de cadre privés pour l’ajout de sous-vues aux vues d’alerte ios 7, c.-à-d.

[alertView setValue: imageView forKey: @ "accessoireView"];

Exemple de code pour une meilleure compréhension,

UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(180, 10, 85, 50)];
UIImage *wonImage = [UIImage imageNamed:@"image.png"];
[imageView setImage:wonImage];

//check if os version is 7 or above
if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) {
      [alertView setValue:imageView forKey:@"accessoryView"];
}else{
      [alertView addSubview:imageView];
}

J'espère que ça aide quelqu'un, merci :)

27
Eshwar Chaitanya

Pour IOS7

UIAlertView *alertView1 = [[UIAlertView alloc] initWithTitle:@"Enter Form Name" 
                                               message:@""
                                               delegate:self 
                                               cancelButtonTitle:@"Cancel"
                                               otherButtonTitles:@"Ok", nil];
alertView1.alertViewStyle = UIAlertViewStyleSecureTextInput;
UITextField *myTextField = [alertView1 textFieldAtIndex:0];
[alertView1 setTag:555];
myTextField.keyboardType=UIKeyboardTypeAlphabet;

[alertView1 show];
17
Ganesh manoj

Il n'y aura ni UIAlertView avec des vues personnalisées dans iOS7, ni contentView qui Apple a changé d'avis, donc addSubview est impossible maintenant dans UIAlertView.

Une bonne alternative sera SVProgressHUD , selon de nombreuses discussions sur le forum d'Apple.

Modifier :

Il n'y a officiellement ni addSubview ni sous-classe pour UIAlertView dans iOS7 .

La classe UIAlertView est destinée à être utilisée telle quelle et ne prend pas en charge les sous-classes. La hiérarchie des vues pour cette classe est privée et ne doit pas être modifiée.

Autres bonnes alternatives:

ios-custom-alertview de wimagguc

MZFormSheetController .

10
null

Vous pouvez trouver une solution simple sans classes supplémentaires ici

Il est basé sur le réglage accessoireView pour UIAlertView ordinaire .

1
malex

PKAlertController ( https://github.com/goodpatch/PKAlertController ) est une excellente bibliothèque. J'ai testé beaucoup de bibliothèques similaires et cela répondait à toutes mes exigences.

Pourquoi c'est cool:

  • Prend en charge l'affichage personnalisé
  • Prend en charge iOS7
  • C'est contrôleur de vue
  • Il se comporte et ressemble à la vue d'alerte native, y compris les effets de mouvement
  • Personnalisable
  • Interface similaire à celle de UIAlertController
1
Igor Palaguta