在UITableViewCell内动画UILabel文本更改

时间:2014-06-04 01:00:13

标签: ios objective-c uitableview uiview uilabel

我想在text属性更改时为自定义UILabel内的UITableViewCell设置动画。

我让动画工作得很好,除了动画在每次滚动时进入视图时以及在调用[myTableView reloadData]时都会触发。

使用像

这样简单的东西
if (![myLabel.text isEqualToString:newText]) {
    // change myLabel.text with animation here. 
}

不起作用。

我明白为什么会这样。 如果我每次都创建一个新单元格,我可以检查myLabel.text是否有字符串,如果是,它是否不同,然后应用更改。但是,有时会显示太多的单元格。

重用单元格时,myLabel.text几乎总会有一个字符串,并且几乎总是与我想要设置的字符串不同。所以上述检查不起作用。无论如何,它们都会导致动画射击。

我能想到的唯一方法就是创建一个包含myLabel.text中最后已知值的数组并进行比较,但这个列表会很大!

我不知道从哪里开始解决这个问题。

myLabel属性发生变化时,我想要UITableViewCell在我的子类text内做一些翻转/ backgroundColor动画。我找到的最接近的解决方案将导致tableviewcell中的所有标签运行动画。

在给它一个字符串之前我也无法检查myLabel.text,因为它总是被重复使用。

我开始觉得这样做无法完成。

4 个答案:

答案 0 :(得分:0)

如果您已将UITableViewCell子类化,则可以覆盖默认的prepareForReuse方法。在此方法中,将标签的文本属性设置为nil

- (void)prepareForReuse {
    [super prepareForReuse];
    myLabel.text = nil;
}

现在:

if (myLabel.text && ![myLabel.text isEqualToString:newText]) {
    // change myLabel.text with animation here. 
}

现在,如果文本已从一个文本更改为新文本,则该文本应仅为其设置动画。

通过tableview的prepareForReuse方法在单元格上调用

dequeueReusableCell

答案 1 :(得分:0)

#pragma mark - Timer Function
-(void)callAfteroneSecond_deals
{
    NSArray *indexes = [self.tbl_deals indexPathsForVisibleRows];
    MYTableViewCell *cell = (MYTableViewCell *)[_tbl_deals cellForRowAtIndexPath:index];


    cell.lbl_expiredtime.text=@"Hello";
    [cell.contentView bringSubviewToFront:cell.lbl_expiredtime];
}

答案 2 :(得分:0)

我会在自定义单元格上定义一个方法,如下所示:

   - (void) updateMyLabel: (NSString *)newText   {
        // If the new value is different than what is already set, 
        // and the label isn't nil, then trigger the animation
        if (self.myLabel.text && self.myLabel.text != newText)    {
            [UIView animateWithDuration...];
        }
        self.myLabel.text = newText;
    }

然后在tableView的cellForRowAtIndexPath中调用该方法。棘手的是,当用户滚动时,或者随着数据的变化(即每次调用reloadData),可以多次调用cellForRowAtIndexPath。

答案 3 :(得分:0)

我设法通过跟踪myLabel.text中保留的先前值来实现它。

我在名为NSMutableDictionary的viewController上创建了一个previousStrings。每个键都是indexPath.row,每个值都是该行的字典。

以下是cellForRow方法内部的一些代码。

NSMutableDictionary *strings;
// check to see if previousStrings already has a dictionary at key of indexPath.row
// if not, then create one.
if (![_previousStrings objectForKey:[NSString stringWithFormat:@"%d", indexPath.row]]) {
    strings = [[NSMutableDictionary alloc] init];
}
else {
    strings = [_previousStrings objectForKey:[NSString stringWithFormat:@"%d", indexPath.row]];
}

然后更改myLabel.text

NSString *cellText = newTextString;
// If the new string is equal to the old string, just set the label without animation
// otherwise run animation and update the value inside the strings dictionary.
if ([strings[@"myLabel"] isEqualToString:newTextString]) {
    cell.myLabel.text = newTextString;
}
else {
    [cell.myLabel runTextChangeAnimationWithString:newTextString];
    [strings setObject:newTextString forKey:@"myLabel"];
}

毕竟,在cellForRow结束时,请务必将字符串dict放回previousStrings

[_previousStrings setObject:strings forKey:[NSString stringWithFormat:@"%d", indexPath.row]];

我希望这对任何绊倒同一问题的人都有意义。 如果不够清楚,请随时编辑并提出问题。

这就是字典的结构。数字是每个单元格的索引路径。

enter image description here