0

ユーザーが複数のナビゲーション ビューで複数の選択を行う UINavigationController アプリケーションがあります。次に、最後のビューで、ユーザーが前のビューからの選択によって定義された情報を表示できるようにします。この情報は、NavigationController スタックの finalview のサブビューに表示されます。

例:

UINavigationController
- Several Views including (final view)
Final View 
- several Subviews

最後のビューが読み込まれたら、didRotate メソッドを実行する deviceOrientation リスナーを作成します。

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];

[[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(didRotate:)
                                                 name:UIDeviceOrientationDidChangeNotification
                                               object:nil];

次に、currentView というメソッドを呼び出します。これは、現在どのサブビューが表示されているかを把握するために使用されます。つまり、これは [finalview.view addSubView:firstView.view] のようなものがあるときに呼び出されます

[self copyCurrentView:@"firstView"];


- (void)copyCurrentView:(NSString *)currentView {

    myCurrentView = currentView;

}

デバイスが回転すると、このメソッドがトリガーされます

-(void)didRotate:(NSNotification *)notification
{
    UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];

    if (orientation == UIDeviceOrientationLandscapeLeft)
    {
        if ([myCurrentView isEqualToString:@"firstView"]) {

           [self.navigationController.view insertSubview:firstView.view aboveSubview:self.navigationController.navigationBar];
           [self.navigationController  setNavigationBarHidden:YES animated:YES];

           [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight animated:NO];
           [firstView.view setBounds:CGRectMake(0, 0, 480.0, 320.0)];
           [firstView.view setCenter:CGPointMake(320/2, 480/2)];
           [firstView.view setTransform:CGAffineTransformMakeRotation(M_PI / 2)];
        }
     //other if statments here


    }
    else if (orientation == UIDeviceOrientationLandscapeRight)
    {
      // do the same here
    }
    else if (orientation == UIDeviceOrientationPortrait || orientation == UIDeviceOrientationPortraitUpsideDown)
    {
        NSLog(@"@port");

     if ([myCurrentView isEqualToString:@"firstView"]) {
        [self.view insertSubview:firstView.view belowSubview:actionTabBar];
        [self.navigationController  setNavigationBarHidden:NO animated:YES];



        [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight animated:NO];
        [firstView.view setBounds:CGRectMake(0.0, infoBarHeight, firstView.view.bounds.size.width, firstView.view.bounds.size.height)];
//        [firstView.view setCenter:CGPointMake(480/2, 320/2)];
        [firstView.view setTransform:CGAffineTransformMakeRotation(M_PI * 2)];
      }
    }
}

今、これは少し面倒で、おそらく本当にランダムな方法に見えます..しかし、私がオンラインで見つけたすべてのものから、良い効果を得る方法を理解することはできません.

現在、デバイスを左に回転させると、完全に全画面表示になります。正しいサイズなどを使用しているにもかかわらず、再度縦向きに回転すると、元の位置に戻ることはありません。

誰かが現在表示されているサブビューのローテーションでモデルビューを設定するのを手伝ってくれるなら、それは大歓迎です。

理解できる方法で説明するのは非常に難しいので、この質問をするのをためらっています..しかし、私は自分がしたことと助けが必要なことをできる限り説明するために最善を尽くしました..誰かができることを願っています.助けて。

よろしく

4

1 に答える 1

3

これが最終的に私にとってうまくいったことです。これは全画面回転を行っています。

- (void)viewDidLoad
{
    [super viewDidLoad];
    isShowingLandscapeView = NO;
    [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(orientationChanged:)
                                                 name:UIDeviceOrientationDidChangeNotification
                                               object:nil];
    // Do any additional setup after loading the view.
}

- (void)orientationChanged:(NSNotification *)notification
{
    UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation;
    CGRect rect = CGRectMake(0, 0, [[UIScreen mainScreen] bounds].size.height, [[UIScreen mainScreen] bounds].size.width);;


    switch (deviceOrientation) {
        case 1:
            [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait animated:NO];
            [UIView beginAnimations:nil context:NULL];
            [UIView setAnimationDuration:0.1];
            self.view.transform = CGAffineTransformMakeRotation(0);
            self.view.bounds = [[UIScreen mainScreen] bounds];
            [UIView commitAnimations];
            break;
        case 2:
            [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortraitUpsideDown animated:NO];
            [UIView beginAnimations:nil context:NULL];
            [UIView setAnimationDuration:0.1];
            self.view.transform = CGAffineTransformMakeRotation(-M_PI);
            self.view.bounds = [[UIScreen mainScreen] bounds];
            [UIView commitAnimations];
            break;
        case 3:
            [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight animated:NO];
            //rect = CGRectMake(0, 0, [[UIScreen mainScreen] bounds].size.height, [[UIScreen mainScreen] bounds].size.width);
            [UIView beginAnimations:nil context:NULL];
            [UIView setAnimationDuration:0.1];
            self.view.transform = CGAffineTransformMakeRotation(M_PI_2);
            self.view.bounds = rect;
            [UIView commitAnimations];
            break;
        case 4:
            [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeLeft animated:NO];
            [UIView beginAnimations:nil context:NULL];
            [UIView setAnimationDuration:0.1];
            //rect = CGRectMake(0, 0, [[UIScreen mainScreen] bounds].size.height, [[UIScreen mainScreen] bounds].size.width);
            self.view.transform = CGAffineTransformMakeRotation(-M_PI_2);
            self.view.bounds = rect;
            [UIView commitAnimations];
            break;

        default:
            break;
    }
}
于 2013-09-18T06:21:20.337 に答える