iphone - 起動しない - 信頼されていないエンタープライズ開発元 検証できない




複数の方向をサポートする最も簡単な方法は? アプリケーションがLandscapeにあるときにカスタムNIBをロードするにはどうすればよいですか? (4)

1つのビューをロードしてから、必要に応じて方向を確認し、別のビューをロードする必要があります。 shouldAutorotateToInterfaceOrientation:向きをチェックします。回転させたい場合はyesを返します。

私は、ナビゲーションコントローラを使ってトランジションを管理しています。 ポートレートビューを上にしてデバイスが回転している場合は、横向きビューをプッシュしてから、ポートレートに戻ったときに横長ビューをポップします。

編集:

私はshouldAutorotateToInterfaceOrientationのすべての向きに対してYESを返しますが、アプリの起動時に呼び出されますか? あなたはこの機能の中であなたの意見を押していますか?

オリエンテーション定数はクエリするグローバルではなく、システムによってコントローラに送信されたメッセージの一部です。 そのため、ビューコントローラが読み込まれる前に向きを簡単に検出することはできません。 代わりに、特定の方向(通常はポートレート)で起動し、すぐに回転するようにアプリを固定します。 (モバイルSafariを参照してください。それは常に肖像画から始まり、次に横に回転します)。

これらは、私がポートレートと風景を取り替えるために使った2つの方法です。

3つすべてのView Controllerには、次のメソッドがあります。

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    // Return YES for supported orientations
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

肖像画はこれを持っています:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {

    if (toInterfaceOrientation==UIInterfaceOrientationLandscapeRight) {
        [self.nav pushViewController:rightLVC animated:NO];
    }
    if (toInterfaceOrientation==UIInterfaceOrientationLandscapeLeft) {
        [self.nav pushViewController:leftLVC animated:NO];
    }
}

各ランドスケープコントローラには、

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {

    if (toInterfaceOrientation==UIInterfaceOrientationPortrait) {
        [self.nav popViewControllerAnimated:NO];
    }

アプリはポートレートで始まります。 デバイスの向きがランドスケープの場合、適切なランドスケープがプッシュされます。 デバイスがポートレートに戻って回転すると、デバイスはランドスケープをポップします。 ユーザーには、同じビューが別の向きで再構成されているように見えます。

私は、複数のオリエンテーションをサポートしたいというアプリケーションを持っています。 私は使用したい2つの.xibファイル、myViewController.xibとmyViewControllerLandscape.xib. myViewController.xib myViewControllerLandscape.xib. myViewController.xibはproject / Resourcesに存在し、 myViewControllerLandscape.xibはルートプロジェクトディレクトリに存在します。

私がしたいことは、私の回転に別のNIB (myViewControllerLandscape.xib)を使用することです。 私はviewDidLoad l回転を検出しようとしていviewDidLoad l

if((self.interfaceOrientation == UIInterfaceOrientationLandscapeLeft) || (self.interfaceOrientation == UIInterfaceOrientationLandscapeRight))
 {
  NSLog(@"Landscape detected!");
  [self initWithNibName:@"myViewControllerLandscape" bundle:nil];

 }

しかし、私はgdbで、アプリケーションがランドスケープでデバイスで起動されても実行されないことがわかります。 NSLogメッセージは起動しません。 どうしてこれなの? 私は何を間違えたのですか?

また、私が明示的にinitWithNibName関数呼び出しをviewDidLoadメソッドに置くと、そのnibはロードされず、 myViewController.xibファイルで続行されます。 私の電話に何が問題なの? バンドルを指定する必要がありますか?

ありがとう!


Adamの答えが本当に好きです - 縦と横のどちらかにペン先を最初から読み込むために少し修正しました

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    if( !nibNameOrNil )     nibNameOrNil = [self nibNameRotated:[[UIApplication sharedApplication] statusBarOrientation]];
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    return self;
}

- (NSString*) nibNameRotated:(UIInterfaceOrientation)orientation
{
    if( UIInterfaceOrientationIsLandscape(orientation))     return [NSString stringWithFormat:@"%@-landscape", NSStringFromClass([self class])];
    return [NSString stringWithFormat:@"%@", NSStringFromClass([self class])];
}

-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
    NSString *nibname = [self nibNameRotated:toInterfaceOrientation];
    [[NSBundle mainBundle] loadNibNamed:nibname owner:self options:nil];
    [self viewDidLoad];
}


私はnavコントローラとは独立して動作する、より良い方法を見つけました。 今のところ、navコントローラに埋め込まれているときにこれが動作していますが、埋め込まれていないときは(Navコントローラを使用していないので、見たことのないバグがあります。面白い、または何か)

Appleの命名規則を使用して2つのNIB 私は、iOS 6または7では、Appleがこれを「機能」として追加する可能性があると考えています。 私は私のアプリでそれを使用しており、それは完全に動作します:

  1. トリガーは回転します(SHOULDは回転しません)。回転するアニメーションが開始されるまで待機します。
  2. ランドスケープ/ポートレートファイルのApple命名規則を使用します(Appleがランドスケープバージョンを自動ロードするようにするにはDefault.pngはDefault-landscape.pngです)
  3. 新しいNIBをリロードします。
  4. self.viewをリセットする - これは自動的にディスプレイを更新する
  5. viewDidLoad呼び出しviewDidLoad (NIBを手動でリロードした場合、Appleはこれを呼び出しません)
-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
    if( UIInterfaceOrientationIsLandscape(toInterfaceOrientation) )
    {
        [[NSBundle mainBundle] loadNibNamed: [NSString stringWithFormat:@"%@-landscape", NSStringFromClass([self class])]
                                      owner: self
                                    options: nil];
        [self viewDidLoad];
    }
    else
    {
        [[NSBundle mainBundle] loadNibNamed: [NSString stringWithFormat:@"%@", NSStringFromClass([self class])]
                                      owner: self
                                    options: nil];
        [self viewDidLoad];
    }
}




xib