我创建了一个自定义视图,可在触发平移手势时调整CALayers的大小。当控件添加到普通UIVIew
时,动画的行为与预期完全一样。
当视图通过UITableViewCell
添加到addSubView
时,动画会跳动。我在手势处理程序中放置了一些NSLog
语句,它的行为完全符合预期。
UITableView
或UITableViewCell
会导致我遇到的这种意外行为吗?使用addSubView添加自定义视图是否正确?
编辑
我有关于这个问题的更多信息。这个问题似乎只出现在某些环境中。
* iPhone 3GS,iOS 4.2.1 - 是
iPod Touch(Retnia),5.1 - NO
iPod模拟器4.2 - 否
iPod模拟器5.1 - 否
我也提出了Lorean和DavidH提出的建议,这些建议没有解决问题。
*当我从XCode构建时,3gs设备旁边会显示一条消息“将基础SDK覆盖到4.3”
这可能是一个潜在的问题吗?
答案 0 :(得分:1)
您应该只将自定义视图添加到单元格的内容视图中。
答案 1 :(得分:1)
虽然我同意视图应该作为contentView中的子视图放置,但还有另一个潜在的问题。移动scrollViews中的动画在历史上是非常糟糕的,因为整个系统不支持两个非耦合动画。
该问题的解决方案是当用户触摸单元格时,禁用滚动(即myTableView.scrollEnabled = NO,然后当平移手势完成时(所有动画),再次启用它。
编辑:这听起来有点时髦,但应该像我过去做的那样工作。当您获得第一个触摸事件时,计算图层的框架是self.view坐标,然后使用此框架将其添加到视图中,但保存旧框架。用户什么也看不见,现在你的观点正在提示中。显然你也必须阻止桌子移动。完成用户交互后,使用旧框架将视图移回单元格。
根据您的触摸方式,您可能需要在清晰的UIView中截取第一次触摸,该UIView覆盖所需的平移视图,当触摸它时,执行以上所有操作,然后将初始触摸转发到视图。希望这一步不是必需的。
答案 2 :(得分:1)
我实施了一个解决问题的黑客攻击。我可能决定完全关闭动画,因为它并不是真的需要,但如果有人有更好的答案,我很乐意接受。
if ([[[UIDevice currentDevice] systemVersion] floatValue]<5.0)
{
[CATransaction begin];
[CATransaction setDisableActions: YES];
}
//do stuff
if ([[[UIDevice currentDevice] systemVersion] floatValue]<5.0) [CATransaction commit];