除了告诉您检查并确保您不会无意中在代码中的某处自动释放视图或图层之外,我无法帮助您解决崩溃问题。我已经看到模拟器处理自动释放的时间与在设备上不同(通常是在涉及线程时)。
不过,视图缩放是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 及更高版本更改了滚动视图在缩放方面的行为。现在,aUIScrollView
将尊重您应用于内容视图的身份转换,并且仅在-scrollViewDidEndZooming:withView:atScale:
. 因此,上面的UIView
子类代码仅对运行 iPhone OS 版本早于 3.2 的设备是必需的。