Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Animation in willSelectRowAtIndexPath after validation

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.

like image 728
Bastian Avatar asked Sep 28 '22 03:09

Bastian


2 Answers

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];
}];
like image 81
bteapot Avatar answered Oct 26 '22 13:10

bteapot


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;
}
like image 45
MacKentoch Avatar answered Oct 26 '22 12:10

MacKentoch