除了建议你检查代码中是否无意中自动释放了视图或图层以外,我无法帮助你解决崩溃问题。我曾经看到模拟器处理自动释放的时间与设备上的不同(尤其是涉及线程时)。
然而,在使用 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];
contentView.previousScale = scale;
scrollView.contentSize = contentView.frame.size;
}
通过这样做,发送到内容视图的变换将根据上次重绘视图时的比例进行调整。当完成捏合缩放时,通过绕过正常的setTransform:
方法将变换重置为比例为1.0。这似乎提供了正确的缩放行为,同时让您在缩放完成时绘制清晰的视图。
更新(7/23/2010):iPhone OS 3.2及以上版本已更改滚动视图在缩放方面的行为。现在,UIScrollView
会尊重您对内容视图应用的恒等变换,并且仅在-scrollViewDidEndZooming:withView:atScale:
中提供相对比例因子。因此,上述代码仅适用于运行早于3.2版本的iPhone OS设备的UIView
子类。