在UITableViewCell = Choppy Scrolling中使用CATransform3D的UIView

时间:2011-09-14 16:49:08

标签: uiview uitableview drawrect catransform3d

我正在使用自定义 UITableViewCell ,我将其置于子类 UIView (在contentView内,natch中)。有问题的 UIView 会显示方向箭头和两行支持文字。

通过具有背景颜色和箭头形状蒙版的图层显示箭头。根据箭头指向的方向,背景颜色会变为两种可能之一。

只要需要更新箭头(基于但不同于当前标题,每个单元格和视图都不同),视图就会收到 NSNotification 。当它收到通知时,视图调用私有方法来执行转换。这会激活箭头图层,有效地将其围绕中心旋转到新方向,如下所示:

    // Update layer BG color, then ...

    [UIView setAnimationBeginsFromCurrentState:YES];
    CATransform3D transform = CATransform3DMakeRotation(DegreesToRadians(locationDirection), 0, 0, 1);
    _arrowLayer.transform = transform;

(n.b。:_arrowLayer仅供内部使用,不通过财产公开。)

UIView 上还有一个属性,用于设置用于创建支持文字的信息。如果更改了此项,则会调用setNeedsDisplaydrawRect:方法会进行计算并绘制生成的文本。

这一切都很好。但是, 我遇到了一个主要问题

在箭头动画的同时滚动表格视图会导致一些大联盟不稳定的滚动,经常到滚动停止的时间点!即使这是contentView中的唯一视图(以最小测试用例的名义),也没关系。

如果设备没有移动,滚动是适度可接受的,但仍有待改进。

我希望我只是犯了一个基本错误(不要使用drawRect:?换一些方法吗?以上都没有?)

提前感谢任何线索/建议!

2011年10月4日更新:我尝试使用 UITableViewController 观看 UIScrollViewDelegate (根据 UIScrollView 编程指南)当滚动开始/停止时,每个方向箭头视图询问其委托(在这种情况下为表VC)是否可以设置动画。尽管如此,这并没有多大帮助。如果动画正在进行中,我们运气不好。也许 NSNotification 是有序的,方向箭头视图可以查找特定通知。 (虽然听起来有些倒退,不是吗?给其他对象提供他们可以发出的通知吗?嗯。)

2 个答案:

答案 0 :(得分:0)

尝试这样的事情:

self.layer.shouldRasterize = YES;

我不确定哪个图层(或多个图层)应该设置此属性,但我经常遇到动画不稳定的问题,通过设置shouldRasterize可以解决哪个问题。

答案 1 :(得分:0)

高性能滚动的技巧是使用CoreGraphics而不是CoreAnimation。可以在这里找到解释:

http://blog.atebits.com/2008/12/fast-scrolling-in-tweetie-with-uitableview/

这是另一个StackOverflow问题: Tricks for improving iPhone UITableView scrolling performance?

所以在这个例子中,我会尝试避免箭头蒙版并用CG

绘制它