3

動作するページカールが機能しています。問題はiPadの回転です。アプリは横向きでのみ実行され、左と右をサポートします。iPadが「横向き」の場合、カールは右下で発生します。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";
    }
}
4

1 に答える 1

3

ページカールがデバイスと一緒に回転していません。

これは、ビューがデバイスの回転に伴って回転していないためです。

これは、そのビューがビュー階層の最上位のビューであるためです。

これに関するドキュメントはどこにも見つかりません(他の誰かがそれを掘り下げることができますか?)が、それでもビュー階層の最も外側のビューが回転しない場合があります。これは、他のすべてを回転させるのはこのビュー(つまり、ある種の回転変換が適用されるこのビュー)であるためだと思います。

これは簡単に確認できます。ビューのフレームと境界をログに記録し、回転時に何が起こるかを確認するだけです。

ここでは、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が追加されています)。しかし、それは風景であると私たちに教えてくれます。

このような奇妙な結果を報告するビューの幾何学的特性に依存したくないことは明らかです。これは、ID変換以外の変換が行われた場合は、ビューのフレームを参照してはならないというAppleの警告に関連していると思います。

解決策は、ページカーリングビューを別の最も外側のビューに埋め込むことです。新しいビューを作成し、それをself.subview(またはその他)と呼び、self.viewの唯一の子としてビュー階層に追加します。self.viewと同じ長方形にサイズ変更します。self.viewではなくself.subviewを操作します。

この行を変更します。

[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>>

変換に注意してください。

于 2013-01-10T06:17:13.480 に答える