29

アプリ内のビューの1つだけを、横向き左または横向き右に回転させたい。他のすべてのビューはポートレートモードであり、ポートレートモードのみをサポートするようにアプリを設定しました。iOS 6で向きが変更されているので、これを行う方法がわかりません。以下の投稿を試してみました。誰かが私が間違っていることを教えてもらえますか?ありがとう!

-(BOOL)shouldAutorotate {
return YES;
}

-(NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight;
}

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{

return UIInterfaceOrientationMaskLandscapeRight | UIInterfaceOrientationMaskLandscapeLeft;
} 

私も試しました:

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(didRotate:)
                                            name:UIDeviceOrientationDidChangeNotification
                                           object:nil];
return YES;//UIInterfaceOrientationMaskLandscapeRight | UIInterfaceOrientationMaskLandscapeLeft;
} 


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

if (orientation == UIDeviceOrientationLandscapeLeft) {
    [theImage setTransform:CGAffineTransformMakeRotation(M_PI / -2.0)];
    [self.view setTransform:CGAffineTransformMakeRotation(M_PI / 2.0)];
} else if (orientation == UIDeviceOrientationLandscapeRight) {
    [theImage setTransform:CGAffineTransformMakeRotation(M_PI / -2.0)];
    [self.view setTransform:CGAffineTransformMakeRotation(M_PI / -2.0)];
} else if (orientation == UIDeviceOrientationPortraitUpsideDown) {
    [theImage setTransform:CGAffineTransformMakeRotation(M_PI / -2.0)];
    [self.view setTransform:CGAffineTransformMakeRotation(M_PI / -2.0)];
} else if (orientation == UIDeviceOrientationPortrait) {
    [theImage setTransform:CGAffineTransformMakeRotation(M_PI / 2.0)];
    [self.view setTransform:CGAffineTransformMakeRotation(M_PI / 2.0)];
}
}
4

7 に答える 7

19

これは私のために働いたiOS6でUIViewControllerを縦向きに強制する方法

回転メソッドをオーバーライドするUINavigationControllerから新しいカテゴリを作成します。

-(BOOL)shouldAutorotate
{
    return [self.topViewController shouldAutorotate];
}

-(NSUInteger)supportedInterfaceOrientations
{
    return [self.topViewController supportedInterfaceOrientations];
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    return [self.topViewController preferredInterfaceOrientationForPresentation];
}

@end 
于 2012-11-23T18:30:08.220 に答える
6

ビューの回転の処理に関してiOS6に変更があります。アプリで定義された向きのみInfo.plistがサポートされます。他のものを返却する場合でも。

プロジェクトでサポートされているすべての方向を選択してみてください。

ビューの回転の処理

iOS 6では、アプリはアプリのInfo.plistファイルで定義されたインターフェースの向きをサポートします。ビューコントローラは、メソッドをオーバーライドしてsupportedInterfaceOrientations、サポートされている方向のリストを制限できます。通常、システムはこのメソッドをウィンドウのルートビューコントローラーまたは画面全体に表示されるビューコントローラーでのみ呼び出します。子ViewControllerは、親View Controllerによって提供されたウィンドウの一部を使用し、サポートされている回転に関する決定に直接関与しなくなりました。アプリの方向マスクとビューコントローラーの方向マスクの交点を使用して、ビューコントローラーを回転できる方向を決定します。

preferredInterfaceOrientationForPresentation特定の方向で全画面表示されることを目的としたViewControllerのをオーバーライドできます。

iOS 5以前では、UIViewControllerクラスはビューをポートレートモードでのみ表示します。追加の方向をサポートするには、shouldAutorotateToInterfaceOrientation:メソッドをオーバーライドし、サブクラスがサポートするすべての方向に対してYESを返す必要があります。ビューの自動サイズ変更プロパティが正しく構成されている場合は、それだけで済みます。ただし、このUIViewControllerクラスには、必要に応じて追加の動作を実装するための追加のフックが用意されています。一般に、View Controllerを子ViewControllerとして使用する場合は、すべてのインターフェイスの向きをサポートする必要があります。

表示されているViewControllerに対して回転が発生すると、回転中にwillRotateToInterfaceOrientation:duration: 、、、willAnimateRotationToInterfaceOrientation:duration:およびdidRotateFromInterfaceOrientation:メソッドが呼び出されます。このviewWillLayoutSubviewsメソッドは、ビューのサイズが変更され、親によって配置された後にも呼び出されます。向きの変更が発生したときにViewControllerが表示されない場合、rotationメソッドが呼び出されることはありません。ただし、viewWillLayoutSubviewsビューが表示されると、メソッドが呼び出されます。このメソッドの実装では、メソッドを呼び出しstatusBarOrientationてデバイスの向きを判別できます。

(C)Apple Docs:UIViewController

于 2012-10-07T22:11:43.087 に答える
2

以下の手順に従ってください

  • 回転メソッドをオーバーライドするUINavigationControllerのサブクラスを作成します。
  • AppDelegateで、BOOLislandscapeプロパティを作成します。
  • ビューがプッシュ/ポップ/表示/却下されたら、このBOOL値を調整します。

サンプルプロジェクト

このためのサンプルプロジェクトを作成しました。これは完全に機能しています。ダウンロードしてプロジェクトに統合します:https ://www.dropbox.com/s/nl1wicbx52veq41/RotationDmeo.zip?dl = 0

于 2015-07-08T05:33:56.070 に答える
0

私は持っています:

TabbarController-> NavigationController-> ViewController-> ViewController

サブクラスUITabBarController化して追加します。

-(NSUInteger)supportedInterfaceOrientations{
    if (self.selectedIndex >= 0 && self.selectedIndex < 100) {
        for (id vC in [[self.viewControllers objectAtIndex:(unsigned long)self.selectedIndex] viewControllers]) {
            if ([vC isKindOfClass:[CLASS_WHICH_SHOULD_ALLOW class]]) {
                return UIInterfaceOrientationMaskPortrait + UIInterfaceOrientationMaskLandscape;
            }
        }
    }
    
    return UIInterfaceOrientationMaskPortrait;
}

于 2014-11-13T01:16:23.677 に答える
0

私は何時間も解決策を探していました!

したがって、必要なメソッドをどこにでも実装した後。すでにデフォルトとして設定されているため、shouldAutorotateに設定する必要はありません。YES

- (NSUInteger)supportedInterfaceOrientations{
    return UIInterfaceOrientationMaskPortrait;
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation{
     return UIInterfaceOrientationPortrait;
}

UIViewController他のビューとは異なる方向を必要とするものを示すときは、次のUIStoryboardSegue実装を使用してを作成しました。

#import "Showing.h"

@implementation Showing

- (void)perform{
    NSLog(@"Showing");
    UIViewController *sourceVC = self.sourceViewController;
    UIViewController *presentingVC = self.destinationViewController;

    [sourceVC.navigationController presentViewController:presentingVC 
                                                animated:YES 
                                              completion:nil];
}

@end

内部ではUIStoryboard、ビューをこのセグエに接続しました(表示):

ここに画像の説明を入力してください

それはただ重要です、あなたは使っています

presentViewController:animated:completion:

ではなく

pushViewController:animated:

そうしないと、向きが再度決定されません。


私は次のようなことを試みていました

[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait];

または、これは向きを変更する必要がある場所の内側にあり、以前UIViewControllerはカスタム内でこれを呼び出しようとしました:UIStoryboardSeguespresentingViewControllerdismissViewController

[UIViewController attemptRotationToDeviceOrientation];

また

NSNumber *numPortrait = [NSNumber numberWithInt:UIInterfaceOrientationPortrait];
[[UIDevice currentDevice] setValue:numPortrait forKey:@"orientation"];

しかし、誰も働いていませんでした。もちろん、最後の例はオプションではありません。アップルがAPIのいずれかを変更すると、アプリ内で問題が発生する可能性があるためです。

また、このメソッドを使用して、実際AppDelegateの正しい方向を探した後、常にこのメソッド内の方向を決定しようとしましたが、ある方向から別の方向に切り替えるときにクラッシュすることがありました。それで、なぜそれがそれほど複雑になったのか疑問に思っています。また、正しく説明されているドキュメントがないようです。この部分をたどっても助けにはなりませんでした。UIInterfaceOrientationvisibleViewController

于 2015-03-31T11:47:19.983 に答える
0

UIViewController + OrientalPermissions.h

@interface UIViewController (OrientationPermissions)
   + (void)setSupportedOrientations:(UIInterfaceOrientationMask)supportedOrientations;
   + (UIInterfaceOrientationMask)supportedOrientations;
@end

UIViewController + OrientalPermissions.m

@implementation UIViewController (OrientationPermissions)
static UIInterfaceOrientationMask _supportedOrientations;

+ (void)setSupportedOrientations:    (UIInterfaceOrientationMask)supportedOrientations {
    _supportedOrientations = supportedOrientations;
}

+ (UIInterfaceOrientationMask)supportedOrientations {
    return _supportedOrientations;
}

@end

UIApplicationデリゲートで

- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {
    return [UIViewController supportedOrientations];
}

次に、目的のViewControllerで次のような操作を行います

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [UIViewController setSupportedOrientations:UIInterfaceOrientationMaskAll];
}

このViewControllerを離れる前に、マスクをリセットすることを忘れないでください

UINavigationControllerまたはUITabBarControllerを使用している場合は、https: //stackoverflow.com/a/28220616/821994を参照してください。

于 2017-05-02T08:34:18.837 に答える
-2

頑張ってみてください。2日後に解決します

//AppDelegate.m-残念ながら、このメソッドはiOS6より前では利用できません

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window{
NSUInteger orientations = UIInterfaceOrientationMaskAllButUpsideDown;

if(self.window.rootViewController){
    UIViewController *presentedViewController = [[(UINavigationController *)self.window.rootViewController viewControllers] lastObject];
    orientations = [presentedViewController supportedInterfaceOrientations];
}

return orientations;
}

//MyViewController.m-各UIViewControllerでサポートする方向を返します

- (NSUInteger)supportedInterfaceOrientations{
    return UIInterfaceOrientationMaskPortrait;
}
于 2015-01-31T07:06:14.960 に答える