3

私のiPadアプリでUISplitViewControllerに少し問題がありました。私は、UISplitViewの内部でUINavigationControllerを使用して簡単なナビゲーションツリーを作成しようとしています。私はこれを行うには、以下の基本的なコードを使用している:このコードが正常にナビゲーションコントローラにビューをプッシュUISplitViewControllerは、内部でUINavigationControllerを使用しようとすると自動回転を停止します

#import "NavController.h" 

@implementation NavController 

@synthesize navigationController; 

- (void) awakeFromNib { 
    UIViewController *testController = [[UIViewController alloc] init]; 
    UITableView *tableView = [[UITableView alloc] init]; 

    [testController setView: tableView]; 

    [navigationController pushViewController: testViewController 
            animated: YES]; 

} 

@end 

NavController.h

@interface NavController : NSObject { 
    /* 
    * This is connected properly to the UINavigationController in the 
    * UISplitViewController through Interface Builder. 
    */ 

    UINavigationController *navigationController; 

} 

@property (nonatomic, retain) IBOutlet UINavigationController *navigationController; 

@end 

NavController.mを、と私は移動することができますしかし、私の問題は、これが起こった後、私のUISplitViewControllerはもはや自動的に回転しないか、またはポートレート位置から全く回転しないという事実に起因しています。このコードを削除すると(ビューがプッシュされない)、期待どおりに機能します。

私は間違っていますか、これについては正しい方法で行っていますか?

ありがとうございました!

答えて

1

これは私にも絶対にナットをもたらしました。私はそれを動作させるいくつかのことをしましたが、私は私の解決策に満足していません - 1)私はそれを本当に理解していない、2)ハッキーのようです。

私は私のアプリデリゲート(私の.mファイル)にこれを追加しました:

@interface UITabBarController (MyApp) 
@end 

@interface UINavigationController (MyApp) 
@end 

@implementation UITabBarController (MyApp) 
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation { 
    return YES; 
} 
@end 

@implementation UINavigationController (MyApp) 
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation { 
    return YES; 
} 
@end 

をこれは、ほとんどの部分のために働きました。自動回転しないビューでは、変換を使用して手動でビューを回転させる必要がありました。私は次のようなことをしました:

- (void)deviceOrientationDidChangeWithAnimation:(BOOL)animated { 
    UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation; 

    if (orientation == oldOrientation) { 
     return; 
    } 

    if (animated) { 
     CGFloat duration = [UIApplication sharedApplication].statusBarOrientationAnimationDuration; 
     [UIView beginAnimations:nil context:nil]; 
     [UIView setAnimationDuration:duration]; 
     [UIView setAnimationDidStopSelector:@selector(orientationChanged)]; 
    } 

    [self sizeToFitOrientation:YES]; 

    if (animated) { 
     [UIView commitAnimations]; 
    } 

    oldOrientation = orientation; 
} 

- (CGAffineTransform)transformForOrientation { 
    UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation; 
    if (orientation == UIInterfaceOrientationLandscapeLeft) { 
     return CGAffineTransformMakeRotation(M_PI*1.5); // rotated CCW 
    } else if (orientation == UIInterfaceOrientationLandscapeRight) { // CW 
     return CGAffineTransformMakeRotation(M_PI/2); 
    } else if (orientation == UIInterfaceOrientationPortraitUpsideDown) { // CCW 
     return CGAffineTransformMakeRotation(-M_PI); 
    } else { // CW 
     return CGAffineTransformIdentity; 
    } 
} 

- (void)sizeToFitOrientation:(BOOL)transform { 
    if (transform) { 
     self.view.transform = CGAffineTransformIdentity; 
    } 

    CGRect frame = [UIScreen mainScreen].applicationFrame; 
    CGPoint center = CGPointMake(frame.origin.x + ceil(frame.size.width/2), frame.origin.y + ceil(frame.size.height/2)); 

    CGFloat width = frame.size.width - 0 * 2; 
    CGFloat height = frame.size.height - 0 * 2; 

    UIInterfaceOrientation _orientation = [UIApplication sharedApplication].statusBarOrientation; 
    if (UIInterfaceOrientationIsLandscape(_orientation)) { 
     self.view.frame = CGRectMake(0, 0, height, width); 
    } else { 
     self.view.frame = CGRectMake(0, 0, width, height); 
    } 
    self.view.center = center; 

    if (transform) { 
     self.view.transform = [self transformForOrientation]; 
    } 
} 

私が作ったミス(あるいは私が永続している悪いこと)を誰かが指摘できれば、私は喜んで学ぶでしょう。 :)

+0

興味深い。私はそれが自動回転するようにUINavigationControllerを設定することについて考えたことはありません。私はこれを挑戦しよう。私は、UISplitViewをもっと使いこなすことを願っています...答えをありがとう! –

+0

今夜試してみる機会があります。私は私のUINavigationControllerをサブクラス化し、自動回転を有効にするために必要なメソッドを追加しました。今は完璧に動作しています!これまでのところ、私は手動回転ビューを行う必要はありませんでした。あなたのソリューションをありがとう! –

+0

それは素晴らしいです!私はまだそれが動作する理由はまだよく理解していないが、私はそれが喜んでいる:) – donkim

関連する問題