34 votes

Comment animer tintColor en gris sur un contrôle personnalisé lorsqu'une feuille / alerte est affichée dans iOS 7?

Dans iOS 7, lorsqu'un UIActionSheet est présenté, le système de contrôle tous les animer leur tintColor - gris. Lorsque la feuille est rejetée, ils s'animent en arrière.

J'ai quelques commandes personnalisée avec des images d'arrière-plan ou drawRect des implémentations d'utiliser la teinte de la couleur, et je tiens à animer ce changement tout comme le système de contrôle.

Apple a ajouté - (void)tintColorDidChange de UIView, mais redessiner avec la nouvelle couleur dans cette méthode n'a pas d'animer le changement - il permet simplement de couleur pleine full gris immédiatement, ce qui semble mal quand les autres commandes du système autour d'elle à animer.

Comment puis-je faire à mon habitude contrôles dessinés animer l' tintColor transition comme Apple?

28voto

Nick Lockwood Points 23277

Pour ce faire, vous pouvez appliquer une transition Core Animation au calque de vue:

 //set up transition
CATransition *transition = [CATransition animation];
transition.type = kCATransitionFade;
transition.duration = 0.4;
[self.layer addAnimation:transition forKey:nil];

//now trigger a redraw of the background using the new colour
//and the transition will cover the redraw with a crossfade
self.flagToIndicateColorShouldChange = YES;
[self setNeedsDisplay];
 

EDIT: il peut exister une condition de concurrence critique entre l’animation et le redessinage, en fonction de la manière dont vous effectuez le redessinage. Si vous pouvez poster le code original redessiné que vous avez essayé de mettre à jour immédiatement (sans animation), je peux fournir une réponse plus précise.

7voto

onmyway133 Points 2196

Avez-vous essayé tintAdjustmentMode ?

Vous devriez regarder WWDC 2013 Session 214 Personnaliser l'apparence de votre application pour iOS 7 et lire l' application de démonstration TicTacToe

Quelque chose comme ça

 - (void)onPopupOpened
{
    [UIView animateWithDuration:0.3 animations:^{
        window.tintAdjustmentMode = UIViewTintAdjustmentModeDimmed;
    }];

    popupView.tintAdjustmentMode = UIViewTintAdjustmentModeNormal;
    popupView.tintColor = [UIColor redColor];
}

- (void)onPopupClosed
{
    [UIView animateWithDuration:0.3 animations:^{
        window.tintAdjustmentMode = UIViewTintAdjustmentModeAutomatic;
    }];
}
 

6voto

Matt Zanchelli Points 123

Ne devrait pas drawRect: être appelé automatiquement pour l'animation de la mise à jour pour le nouveau tintColor?

J'ai fait une démo de l'application qui a trois contrôles dans la vue principale du contrôleur. Le premier est un bouton qui met en place une norme d'action de la feuille. Le second est un bouton qui est là pour l'observation (l'taraudés bouton est difficile de le comparer à lors de l'animation). La troisième est une coutume UIView sous-classe qui dessine simplement un rectangle de la vue de l' tintColor. Lors de l' tintColorDidChange s'appelle, j'appelle setNeedsDisplay, qui appellera à son tour drawRect:.

J'ai créé une nouvelle application avec une vue contrôleur:

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    [[UIApplication sharedApplication] keyWindow].tintColor = [UIColor blueColor];

    // Button to bring up action sheet
    UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    button.frame = (CGRect){10,30,300,44};
    [button setTitle:@"Present Action Sheet" forState:UIControlStateNormal];
    [button addTarget:self
               action:@selector(didTapPresentActionSheetButton:)
     forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:button];

    // Another button for demonstration
    UIButton *anotherButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    anotherButton.frame = (CGRect){10,90,300,44};
    [anotherButton setTitle:@"Another Button" forState:UIControlStateNormal];
    [self.view addSubview:anotherButton];

    // Custom view with tintColor
    TESTCustomView *customView = [[TESTCustomView alloc] initWithFrame:(CGRect){10,150,300,44}];
    [self.view addSubview:customView];
}

- (void)didTapPresentActionSheetButton:(id)sender
{
    UIActionSheet *as = [[UIActionSheet alloc] initWithTitle:@"Action Sheet"
                                                    delegate:nil
                                           cancelButtonTitle:@"Cancel"
                                      destructiveButtonTitle:@"Delete"
                                           otherButtonTitles:@"Other", nil];
    [as showInView:self.view];
}

TESTCustomView est UIView sous-classe avec la mise en œuvre comme suit:

- (void)drawRect:(CGRect)rect
{
    NSLog(@"Drawing with tintColor: %@", self.tintColor);

    // Drawing code
    [super drawRect:rect];

    CGContextRef c = UIGraphicsGetCurrentContext();
    CGContextSetFillColorWithColor(c, self.tintColor.CGColor);
    CGContextFillRect(c, rect);
}

- (void)tintColorDidChange
{
    [self setNeedsDisplay];
}

L'exécution de cette application dans le simulateur montre que l'affichage personnalisé de la nuance de couleur est automatiquement animé avec la norme UIButton des cas dans la vue-contrôleur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X