2013-06-05 9 views
5

これまで同様の質問がありましたが、これはより具体的な使用例です(静的ライブラリからの方向制御、ルートビューコントローラへの書き込みはできません)。iOSポートレートの向きを静的ライブラリから1つのビューコントローラのみに変更

私は、渡されたビューコントローラ(クライアントのルートビューコントローラ)にオーバーレイとしてUI要素をサブビューとして追加する静的ライブラリを持っています。問題は私たちのUI要素がポートレイト方向のみをサポートし、クライアントのアプリケーションがポートレイトとランドスケープの両方をサポートすることです。クライアントのビューでUI要素が自動回転しない限り、これは問題ありません。

オリエンテーションをポートレートに固定するのは、View Controllerのみです。私は、ルートビューコントローラで同じコードを配置する場合、それは完璧に動作

-(BOOL)shouldAutorotate{ 
return NO; 
} 

-(NSInteger)supportedInterfaceOrientations{ 
    NSInteger orientationMask = 0; 
    if ([self shouldAutorotateToInterfaceOrientation: UIInterfaceOrientationPortrait]) 
     orientationMask |= UIInterfaceOrientationMaskPortrait; 
    return orientationMask; 
} 

:私は私のライブラリのビューコントローラに次のコードを使用するときのiOS 6では、それがすべてで自動回転の動作には影響しません。アプリは自動回転しなくなりました。しかし、プロダクションではクライアントのルートビューコントローラにアクセスできないため、これはオプションではありません。ルートビューコントローラではなくビューの方向をロックする方法、または単一のビューコントローラに対してのみ方向をロックする方法はありますか?私が必要とするものを達成するための他の方法は、私が考えていないのですか? iOSで動作するソリューションのための願望

+0

? –

+0

あなたは解決策を見つけたことがありますか? –

答えて

0

アプリケーション全体で1つのビューコントローラに対してのみ向きをロックすることはできません。ビューの起動時と方向の変更時に、親ビューフレームで変換角度を設定する必要があります。 (UIInterfaceOrientation)fromInterfaceOrientation {

UIInterfaceOrientation方位= [のUIApplication sharedApplication] statusBarOrientation:

あなたはそれらのビューコントローラクラス

- (void)viewWillAppear:(BOOL)animated{ 
[super viewWillAppear:animated]; 
UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation]; 
if (orientation == UIInterfaceOrientationLandscapeLeft || orientation == UIInterfaceOrientationLandscapeRight) { 
    [[self view] setBounds:CGRectMake(0, 0, self.view.frame.size.height, self.view.frame.size.width)]; 
    CGFloat radians = atan2f(self.view.transform.b, self.view.transform.a); 
    if (radians!=M_PI_2) { 
     [[self view] setTransform:CGAffineTransformMakeRotation(M_PI_2)]; 

    } 

} 

}

  • (ボイド)didRotateFromInterfaceOrientationためのコードを追加します]; if(orientation == UIInterfaceOrientationLandscapeLeft || orientation == UIInterfaceOrientationLandscapeRight){ [[selfビュー] setBounds:CGRectMake(0、0、self.view.frame.size.height、self.view.frame.size.width)] ; CGFloatラジアン= atan2f(self.view.transform.b、self.view.transform.a); if(radians!= M_PI_2){ [selfビュー] setTransform:CGAffineTransformMakeRotation(M_PI_2)];

    } 
    

    }他{

    [セルフビュー] setBounds:CGRectMake(0、0、self.view.frame.size.width、self.view.frame.size.height)]。 CGFloatラジアン= atan2f(self.view.transform.b、self.view.transform.a); if(radians!= 0){ [selfビュー] setTransform:CGAffineTransformMakeRotation(0)];あなたの要素がインスタンス化されたときにデバイスがすでに風景の中にあることを考慮するにはどうすればよい

    } 
    

    }}

関連する問題