iPhone 3gs 4.2.1上UITableViewCell中的CALayer动画跳跃



我创建了一个自定义视图,当触发平移手势时,它会调整CALayers的大小。将控件添加到普通UIVIew时,动画的行为完全符合预期。

当视图通过addSubView添加到UITableViewCell时,动画是跳跃的。我在手势处理程序中放置了一些NSLog语句,它的行为与预期完全一样。

UITableViewUITableViewCell是否有任何东西会导致我正在经历的这种意外行为?使用addSubView添加自定义视图是否正确?

编辑

我对这个问题有更多的了解。这个问题似乎只出现在某些环境中。

*iPhone 3GS,iOS 4.2.1-
iPod Touch(Retnia),5.1-
iPod模拟器4.2-
iPod模拟器5.1-

我还采纳了Lorean和DavidH的建议,但这些建议并没有解决问题。

*当我从XCode构建时,3gs设备旁边有一条消息,上面写着"Overrideing base SDK to 4.3"

这可能是一个潜在的问题吗?

您应该只向单元格的内容视图添加自定义视图。

http://developer.apple.com/library/ios/#documentation/uikit/reference/UITableViewCell_Class/Reference/Reference.html

虽然我同意将视图作为子视图放置在contentView中,但还有另一个潜在问题。滚动视图中的动画在历史上是糟糕的,因为整个系统的设计不支持两个不耦合的动画。

这个问题的解决方案是,当用户触摸单元格时,您禁用滚动(即myTableView.scrollEnabled=NO,然后当平移手势完成时(所有动画),再次启用它。

编辑:这听起来有点时髦,但应该像我过去做过的那样有效。当您获得第一个触摸事件时,计算层的帧是self.view坐标,然后使用此帧将其添加到视图中,但保存旧帧。用户看不到任何内容,现在您的视图处于提示状态。显然,您还必须防止桌子移动。完成用户交互后,使用其旧框架将视图移回单元格。

根据您进行触摸的方式,您可能需要在覆盖所需平移视图的清晰UIView中截取第一次触摸,当它被触摸时,执行以上所有操作,然后将初始触摸转发到视图。希望这一步不需要。

我已经实现了一个破解,它解决了这个问题。我可能会决定完全关闭动画,因为这不是真正需要的,但如果有人有比这更好的答案,我很乐意接受。

if ([[[UIDevice currentDevice] systemVersion] floatValue]<5.0) 
{    
    [CATransaction begin];
    [CATransaction setDisableActions: YES];
}
//do stuff
if ([[[UIDevice currentDevice] systemVersion] floatValue]<5.0) [CATransaction commit];

最新更新