我想在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
,因为它总是被重复使用。
我开始觉得这样做无法完成。
答案 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]];
我希望这对任何绊倒同一问题的人都有意义。 如果不够清楚,请随时编辑并提出问题。
这就是字典的结构。数字是每个单元格的索引路径。