iceyouyou / UUMarqueeView

[iOS]Customizable marquee view. #Marquee,MarqueeView,跑马灯,滚屏,上翻,左滑,多行,自定义
MIT License
361 stars 47 forks source link

一个bug #27

Closed JimmyCJJ closed 4 years ago

JimmyCJJ commented 4 years ago

放在cell里面,第一次tableview刷新cell高度为0,然后请求完给数据源赋值了,cell给了一定的高度 if (indexPath.section == 0) { if(self.model.marquees.count == 0){ return 0; } return 45; } 在setModel里面调用了2次[self.marqueeView reloadData]; 结果出现文字label的高度为0 需要延迟一下刷新高度才能刷新出来 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ [self.marqueeView reloadData]; });

iceyouyou commented 4 years ago

@JimmyCJJ 根据你的描述,我猜测你在[UITableView reloadData]后同步调用了[UUMarqueeView reloadData]。

UITableView从reloadData到cell完成刷新是异步行为,同步的[UUMarqueeView reloadData]会早于 UITableView的heightForRowAtIndexPath回调(可以在这两处分别打断点看谁先执行)。

所以,在heightForRowAtIndexPath前cell高度还是0,此时如果你在UUMarqueeView的createItemView回调中 根据cell高度设置label高度自然会有问题。

如果一定要在[UITableView reloadData]后同步使用[UUMarqueeView reloadData],你的方案可行,更好的解决方案是:

[UITableView reloadData];
dispatch_async(dispatch_get_main_queue(), ^{
    [UUMarqueeView reloadData];
});
JimmyCJJ commented 4 years ago

感谢你的回答,异步刷新可以解决问题。有一个点是,我是在请求完成后调用[UITableView reloadData]的,之后会走height for row,然后才到cellForRow,才到setmodel的[UUMarqueeView reloadData],所以你所说的“同步的[UUMarqueeView reloadData]会早于 UITableView的heightForRowAtIndexPath回调(可以在这两处分别打断点看谁先执行)”我个人测试出来好像是先heightForRowAtIndexPath再[UUMarqueeView reloadData]

iceyouyou commented 4 years ago

@JimmyCJJ 连续使用[UITableView reloadData]和[UUMarqueeView reloadData]是我说的同步调用情况。我之前猜测你代码中使用了这样的调用方式。

回到你的问题,因为不清楚细节,就不再继续猜测了。建议检查UUMarqueeView的createItemView回调中布局Label的代码,尽量使用AutoLayout。另外,可以考虑是否受到了cell复用的影响。

这不是UUMarqueeView控件本身会造成的bug,如果还有问题,可以多贴一些关键代码上来。

JimmyCJJ commented 4 years ago

好的额,可以留个联系方式交流一下吗