2012-11-13 41 views
3

我有一個正常工作的頁面捲曲。問題在於iPad的旋轉。該應用程序只在橫向上運行,並支持左和右。如果iPad是「正確的風景」,捲曲會發生在右下角。如果我旋轉iPad,視圖按預期旋轉,但現在當我嘗試在左上角發生捲曲時。我添加了一個通知,告訴我它何時旋轉,並嘗試更改動畫子類型但沒有骰子。CATransition不尊重iPad上的方向更改

-(IBAction)curlViewUp 
{ 
    uiv_help.alpha = 1.0; 

    [UIView animateWithDuration:1.0 
        animations:^{ 
         CATransition *animation = [CATransition animation]; 
         [animation setDelegate:self]; 
         [animation setDuration:0.7]; 
         [animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]]; 
         animation.type = @"pageCurl"; 
         animation.subtype = curlDirection; 
         animation.fillMode = kCAFillModeForwards; 
         animation.endProgress = 0.20; 
         [animation setRemovedOnCompletion:NO]; 
         [self.view.layer addAnimation:animation forKey:@"pageCurlAnimation"]; 
         [self.view addSubview:uiv_help]; 
         ;} 
    ]; 
} 

-(IBAction)curlViewDown 
{ 
    uiv_help.alpha = 0.0; 

    [UIView animateWithDuration:1.0 
        animations:^{ 
         CATransition *animation = [CATransition animation]; 
         [animation setDelegate:self]; 
         [animation setDuration:0.7]; 
         [animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]]; 
         animation.type = @"pageUnCurl"; 
         animation.subtype = curlDirection; 
         animation.fillMode = kCAFillModeForwards; 
         animation.startProgress = 0.80; 
         [animation setRemovedOnCompletion:YES]; 
         [self.view.layer addAnimation:animation forKey:@"pageUnCurlAnimation"]; 
         //[self.view removeFromSuperview]; 
         [uiv_help removeFromSuperview]; 
         ;} 
    ]; 

} 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    return (interfaceOrientation == UIInterfaceOrientationLandscapeLeft | interfaceOrientation == UIInterfaceOrientationLandscapeRight); 
} 

-(void)checkRotation:(NSNotification*)notification 
{ 
    UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation; 
    if(orientation == UIInterfaceOrientationLandscapeLeft) 
    { 
     NSLog(@"UIInterfaceOrientationLandscapeLeft"); 

     curlDirection = @"fromRight"; 
    } else if (orientation == UIInterfaceOrientationLandscapeRight) { 
     NSLog(@"UIInterfaceOrientationLandscapeRight"); 

     curlDirection = @"fromRight"; 
    } 
} 
+0

我認爲它必須是一個uikit錯誤或其他東西... – jonydep

+0

它可能只是一個錯字,當你將它複製到StackOverflow時,但這裏它說curlDirection = @「fromRight」方向是左還是右。 –

+0

爲什麼人們提供賞金時,他們無意追蹤他們? – foundry

回答

3

您的pagecurl不隨設備旋轉。

這是因爲它的觀點是不與設備旋轉旋轉..

是因爲它的觀點是在視圖層次結構的最頂層視圖。

我找不到任何地方的文檔(其他人可以把它挖出來嗎?),但是視圖層次結構中最外層的視圖不旋轉。我想這是因爲這個觀點是誰的責任是旋轉其他所有東西(或者說,這個視圖是應用了某種旋轉變換的)。

這是一個簡單的事情來驗證,只需記錄您的視圖的框架和邊界,並觀察旋轉發生了什麼。

這裏我們處於portait模式。我已經在self.view中設置了一個包含相同尺寸的子視圖。

self.view frame {{0, 20}, {768, 1004}} 
self.view bounds {{0, 0}, {768, 1004}} 
self.view center {384, 522} 
-------- 
self.subview frame {{0, 0}, {768, 1004}} 
self.subview bounds {{0, 0}, {768, 1004}} 
self.subview center {384, 502} 

現在讓我們旋轉爲橫向

self.view frame {{20, 0}, {748, 1024}} 
self.view bounds {{0, 0}, {1024, 748}} 
self.view center {394, 512} 
-------- 
self.subview frame {{0, 0}, {1024, 748}} 
self.subview bounds {{0, 0}, {1024, 748}} 
self.subview center {512, 374} 

你會看到,內子視圖正確報告寬度1024和高度爲748px。 但外觀看起來很奇怪。它的框架報告寬度爲748,高度爲1024,就好像它仍然是肖像(添加了狀態欄20px)。但它是界限告訴我們它是風景。

我們顯然不想依賴報告這種奇怪結果的視圖的幾何屬性。我想這與Apple的警告有關,如果它已經受到除身份變換之外的任何變換,則不應該引用視圖的框架。

解決方案是將頁面瀏覽視圖嵌入到另一個最外層的視圖中。創建一個新視圖,將其稱爲self.subview(或其他),並將其作爲self.view的唯一子視圖添加到視圖層次結構中。將其大小設置爲與self.view相同的矩形。使用self.subview而不是self.view。

改變這一行:

[self.view.layer addAnimation:animation forKey:@"pageCurlAnimation"]; 

[self.subview.layer addAnimation:animation forKey:@"pageCurlAnimation"]; 

和改變這一行:

[self.view.layer addAnimation:animation forKey:@"pageUnCurlAnimation"]; 

到:

[self.subview.layer addAnimation:animation forKey:@"pageUnCurlAnimation"]; 

然後,您的捲髮將按照您的預期進行操作,因爲您正在將它們應用於按預期旋轉的視圖。

您可以在不更改代碼的情況下實現相同的結果,但將viewController嵌入到UINavigationViewController中。在這種情況下,NavViewController的視圖是不旋轉的最外層視圖。所以你的self.view會旋轉。

更新

UIWindow* mWindow = [[UIApplication sharedApplication] keyWindow]; 
UIView *topView = [[mWindow subviews] lastObject]; 
NSLog("%@",topView); 


topView <UILayoutContainerView: 0x71eb450; 
frame = (0 0; 748 1024); 
transform = [0, 1, -1, 0, 0, 0];  
autoresize = W+H; gestureRecognizers = <NSArray: 0x71f8a30>; 
layer = <CALayer: 0x71eb540>> 

注意變換。

+0

不幸的是UINavigationViewController根本沒有幫助。向navcontroller pushviewController應用curl轉換將導致發生錯誤行爲:curl忽略設備方向。 –

相關問題