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 .
Voici un projet sur Github d'ajouter n'importe quel UIView à un dialogue ressemblant à UIAlertView sur iOS7.
(Copié à partir de ce thread StackOverflow .)
Il ne m'a fallu qu'un jour pour créer ma propre vue d'alerte qui ressemble exactement à celle d'Apple.
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).Implémentez toutes les méthodes de UIAlertView
sur votre alerte personnalisée.
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).
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
}];
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 .
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 :)
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];
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:
Vous pouvez trouver une solution simple sans classes supplémentaires ici
Il est basé sur le réglage accessoireView pour UIAlertView ordinaire .
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: