2012-08-02 63 views
2

我製作了一個具有許多UIView子類視圖的應用程序。這些視圖的大小和方向是隨機的,應用程序的屏幕狀態可以保存。當用戶將屏幕保存在與其打開的設備相同的設備上時,屏幕狀態爲OK。一切都定位正確。但是,如果用戶將屏幕狀態保存在iPhone上並從iPad打開,則視圖位置不正確。實際上視圖看起來更短或更長,中心似乎被正確保存,但視圖的旋轉和它們的大小(邊界屬性)不能正常工作。以編程方式將uiviews適用於iPad/iPhone屏幕

這些都是兩種方法保存和恢復視圖

- (void)encodeWithCoder:(NSCoder *)aCoder { 
    // Save the screen size of the device that the view was saved on 
    [aCoder encodeCGSize:self.gameView.bounds.size forKey:@"saveDeviceGameViewSize"]; 

    // **************** 
    // ALL properties are saved in normalized coords 
    // **************** 

    // Save the center of the view 
    CGPoint normCenter = CGPointMake(self.center.x/self.gameView.bounds.size.width, self.center.y/self.gameView.bounds.size.height); 
    [aCoder encodeCGPoint:normCenter forKey:@"center"]; 

    // I rely on view bounds NOT frame 
    CGRect normBounds = CGRectMake(0, 0, self.bounds.size.width/self.gameView.bounds.size.width, self.bounds.size.height/self.gameView.bounds.size.height); 
    [aCoder encodeCGRect:normBounds forKey:@"bounds"]; 

    // Here I save the transformation of the view, it has ONLY rotation info, not translation or scalings 
    [aCoder encodeCGAffineTransform:self.transform forKey:@"transform"]; 
} 

- (id)initWithCoder:(NSCoder *)aDecoder { 
    self = [super initWithCoder:aDecoder]; 
    if (self) { 

     // Restore the screen size of the device that the view was saved on 
     saveDeviceGameViewSize = [aDecoder decodeCGSizeForKey:@"saveDeviceGameViewSize"]; 

     // Adjust the view center 
     CGPoint tmpCenter = [aDecoder decodeCGPointForKey:@"center"]; 
     tmpCenter.x *= self.gameView.bounds.size.width; 
     tmpCenter.y *= self.gameView.bounds.size.height; 
     self.center = tmpCenter; 

     // Restore the transform 
     self.transform = [aDecoder decodeCGAffineTransformForKey:@"transform"]; 

     // Restore the bounds 
     CGRect tmpBounds = [aDecoder decodeCGRectForKey:@"bounds"]; 
     CGFloat ratio = self.gameView.bounds.size.height/saveDeviceGameViewSize.height; 
     tmpBounds.size.width *= (saveDeviceGameViewSize.width * ratio); 
     tmpBounds.size.height *= self.gameView.bounds.size.height; 
     self.bounds = tmpBounds; 
    } 
    return self; 
} 

回答

0

很大程度上取決於當你申請你改造上的狀態。我建議,當你加載你的看法如下步驟:
1.負荷的觀點界限
2.負載觀察中心
3.負荷改造

也有與此代碼的問題。您在設置中心後設置界限。這是完全錯誤的,因爲邊界屬性不會始終工作。嘗試按照我所描述的步驟進行操作,並將結果報告回去,但它應該起作用。

+0

THX您的回覆但不幸的是它沒有工作做。當視圖保存在iPhone上並在iPad上打開時,它的元素在iPad屏幕的x軸上顯示得更短。在Y軸上沒有問題。當一個視圖保存在iPad上並在iPhone上打開時,會發生完全相反的情況。 – Summon 2012-08-10 15:30:41

+0

不客氣,但我想解決您的問題:)您是否嘗試調試應用程序,並在保存/加載之前和之後檢查兩個設備上的值?也許這些值可以顯示他們有什麼問題。 – 2012-08-10 20:18:08

+0

問題的根源在於當視圖旋轉時,將寬度除以屏幕寬度以正常化其大小是錯誤的,因爲寬度可能等於由於旋轉或寬度和高度的組合而造成的高度例如45度旋轉。而且,iPad的寬高比與iPhone不同,所以這是另一個需要擔心的問題。我希望看到成功處理這些問題的代碼。 – Summon 2012-08-11 06:16:33

1

如何分離您的iPhone和iPad版本之間的視圖狀態?對於每個設備,如果該設備的配置尚未保存,只需使用默認設置?我還沒有看到你的用戶界面,但我認爲一般來說,這樣的解決方案可以很好地工作,更容易實現,並且也可以遵循用戶的期望。

0

self.gameView.bounds可以根據您使用的設備而變化嗎?如果答案是肯定的,我會看到一個問題,因爲您在通過gameView邊界規格化規範化後存儲centre,但是當您恢復centre時,您將其規範化爲存儲的gameView.bounds比當前設備的gameView.bounds的值更大。

而且,代碼// Restore the bounds位看起來錯誤,因爲在這種設置tmpBounds.size.width =你正在做的,涉及的寬度和比率是兩種寬度的比例計算行。換句話說,沒有涉及哪個看起來錯誤的height。也許它應該是以下?

// note: height, not width, used on RHS 
tmpBounds.size.width *= (saveDeviceGameViewSize.height * ratio); 

爲了通常與此固定(如果上述不幫助)着手:你需要

一)驗證您正在實施的事情是有意義的(即算法在頭),並

二)驗證您的權利,通過分析你的代碼並保存+還原代碼做一些明智的調試/ NSLogging