I have a table view delegate which checks if a specific cell may be selected. If not, the selection is aborted. In order to give the user a visual feedback I want to dye a label of this cell red and after a short amount of time dye it back to black:
- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (true) {                    // Some simplification
        MyTableViewCell cell = ... // The correct cell is loaded here
        [UIView animateWithDuration:0.5 animations:^{
            cellToSelect.labelAmount.textColor = [UIColor redColor];
        } completion:^(BOOL finished) {
            [UIView animateWithDuration:1.0 animations:^{
                cellToSelect.labelAmount.textColor = [UIColor blackColor];
            }];
        }];
        return nil;
    }
    return indexPath;
}
The animations are not performed. Instead, the cell is just (visually) deselected.
EDIT: I just tried the proposed solutions and neither seemed to work. So I digged a little bit further and found out that I can do animations but am not able to change the textColor of any label inside a cell:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    MyTableViewCell cell = ...
    cell.labelAmount.textColor = [UIColor redColor];
    // Now, although the property was set (as I can see in the debugger) 
    // the label is still drawn with standard black text. 
}
Also, setting the color via a colorful attributed string does not work.
On the other hand, a change of highlightedTextColor is presented accordingly. So this works.
This property - textColor - is not animatable. Use transitionWithView:duration:options:animations:completion:
[UIView transitionWithView:label duration:0.5 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
    label.textColor = [UIColor redColor];
} completion:^(BOOL finished) {
    [UIView transitionWithView:label duration:1.0 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
        label.textColor = [UIColor blackColor];
    } completion:nil];
}];
                        Conforming to apple documentation you can't animate all you want:
From apple :
The following properties of the UIView class are animatable:
- @property frame
 - @property bounds
 - @property center
 - @property transform
 - @property alpha
 - @property backgroundColor
 - @property contentStretch
 
Now this is a trick to animate what you want:
For instance, set alpha to 1.0 - will result in no visual change to the view but launch animation
- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (true) {                    // Some simplification
        MyTableViewCell cell = ... // The correct cell is loaded here
        [UIView animateWithDuration:0.5 animations:^{
            //here the trick set alpha to 1
            self.view.alpha = 1;
            cellToSelect.labelAmount.textColor = [UIColor redColor];
        } completion:^(BOOL finished) {
            [UIView animateWithDuration:1.0 animations:^{
                cellToSelect.labelAmount.textColor = [UIColor blackColor];
            }];
        }];
        return nil;
    }
    return indexPath;
}
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With