除了告诉您检查并确保您不会无意中自动释放代码中某处的视图或图层之外,我无法帮助您解决崩溃问题。我已经看到模拟器处理自动释放时间的方式与设备上不同(通常是在涉及线程时)。
不过,我遇到过UIScrollView 的视图缩放问题。在捏缩放事件期间,UIScrollView 将采用您在viewForZoomingInScrollView: 委托方法中指定的视图并对其应用转换。这种变换提供了视图的平滑缩放,而不必在每一帧都重新绘制它。在缩放操作结束时,您的委托方法scrollViewDidEndZooming:withView:atScale: 将被调用,并让您有机会以新的比例因子对视图进行更高质量的渲染。通常,建议您将视图上的转换重置为CGAffineTransformIdentity,然后让您的视图以新的大小比例手动重绘。
但是,这会导致一个问题,因为UIScrollView 似乎没有监视内容视图转换,因此在下一次缩放操作中,它将内容视图的转换设置为整体比例因子。由于您已在最后一个比例因子处手动重绘视图,因此它会复合缩放,这就是您所看到的。
作为一种解决方法,我为内容视图使用 UIView 子类,并定义了以下方法:
- (void)setTransformWithoutScaling:(CGAffineTransform)newTransform;
{
[super setTransform:newTransform];
}
- (void)setTransform:(CGAffineTransform)newValue;
{
[super setTransform:CGAffineTransformScale(newValue, 1.0f / previousScale, 1.0f / previousScale)];
}
previousScale 是视图的浮点实例变量。然后我实现缩放委托方法如下:
- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale;
{
[contentView setTransformWithoutScaling:CGAffineTransformIdentity];
// Code to manually redraw view at new scale here
contentView.previousScale = scale;
scrollView.contentSize = contentView.frame.size;
}
通过这样做,发送到内容视图的变换会根据上次重绘视图的比例进行调整。缩放完成后,通过绕过正常setTransform: 方法中的调整,将变换重置为1.0 的比例。这似乎提供了正确的缩放行为,同时让您在完成缩放时绘制清晰的视图。
更新(2010 年 7 月 23 日):iPhone OS 3.2 及更高版本更改了滚动视图在缩放方面的行为。现在,UIScrollView 将尊重您应用于内容视图的身份转换,并且仅在-scrollViewDidEndZooming:withView:atScale: 中提供相对比例因子。因此,UIView 子类的上述代码仅适用于运行 iPhone OS 版本低于 3.2 的设备。