我不能幫助你崩潰,除了告訴你檢查並確保你不是無意中在代碼中的某個地方自動釋放視圖或圖層。我已經看到模擬器處理自動釋放的時間與設備上的時間不同(大多數時候涉及到線程)。
雖然我遇到了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的縮放比例。這似乎提供了正確的縮放行爲,同時讓您在完成縮放時繪製清晰的視圖。
UPDATE(7/23/2010):iPhone OS 3.2及以上版本已經改變了滾動視圖在縮放方面的行爲。現在,UIScrollView
將尊重您應用於內容視圖的身份轉換,並僅在-scrollViewDidEndZooming:withView:atScale:
中提供相對比例因子。因此,對於運行iPhone 3.2以上版本的設備,僅需要UIView
子類的上述代碼。
您可能需要更具體些。哪些錯誤?我在應用程序中幾乎完全像這樣使用代碼,它在那裏工作得很好。 – 2009-07-10 12:17:25
爲什麼內容視圖不斷消失? – domlao 2009-12-06 16:56:36
您還沒有提供太多信息,但是如果您沒有手動隱藏或從層次結構中刪除內容視圖,我的猜測是它正在變得比GPU支持的紋理大小更大。如果視圖變得比2048像素更寬或更高,它不能再在iPhone和iPhone 3G上呈現(我不能說3GS)。 – 2009-12-06 20:14:56