68

私のアプリは、iphoneデバイス (iPhone 4 と 5 の両方) 専用で、サポートするように構築されていios 6ます。

私のアプリ全体はportraitモードのみをサポートしています。しかし、とモードChatViewの両方をサポートしたい " "というビューが 1 つあります。landscapeportrait

必要なデバイスのローテーションを次のように設定しました-

ここに画像の説明を入力

「ChatView」での回転をサポートするために、次のコードも試しました-

-(BOOL)shouldAutorotate
{
    return YES;
}

-(NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskLandscape;
}

しかし、そのビューを回転できませんでした。

私はこれをたくさん検索しましたが、私の問題の解決策を見つけることができませんでした.

また、「ChatView」には、ボタン、フレームがプログラムで設定されたテキストフィールドなどのオブジェクトがいくつかあります。だから私はランドスケープモードでもこれらすべてのオブジェクトのフレームを設定する必要があるか知りたいですか?

私を助けてください。

ありがとう.....

4

14 に答える 14

66

シンプルですが、とてもうまく機能します。IOS 7.1 および 8

AppDelegate.h

@property () BOOL restrictRotation;

AppDelegate.m

-(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
if(self.restrictRotation)
    return UIInterfaceOrientationMaskPortrait;
else
    return UIInterfaceOrientationMaskAll;
}

ViewController

-(void) restrictRotation:(BOOL) restriction
{
    AppDelegate* appDelegate = (AppDelegate*)[UIApplication sharedApplication].delegate;
    appDelegate.restrictRotation = restriction;
}

viewDidLoad

[self restrictRotation:YES]; or NO
于 2014-09-20T19:35:30.337 に答える
28

ビューコントローラーの回転を1つだけサポートしたい場合、アプリケーションは.plistファイルで設定した向きに従うため、それは不可能だと思います。あなたが従うことができる別の方法は、横向きと縦向きの両方でアプリをサポートし、チャットビューを除いてすべてのビューコントローラーの回転を縦向きに固定することです。

編集

をサブクラスUINavigationController化するには、eg という名前の新しいファイルを作成し、CustomNavigationControllerそれを のサブクラスにしUINavigationControllerます。

.h ファイル

#import <UIKit/UIKit.h>

@interface CustomNavigationController : UINavigationController

@end

.m ファイル

#import "CustomNavigationController.h"

@interface CustomNavigationController ()

@end


@implementation CustomNavigationController

-(BOOL)shouldAutorotate
{
    return NO;
}

-(UIInterfaceOrientationMask)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskAll;
}


- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return UIInterfaceOrientationIsPortrait(interfaceOrientation);
}

@end

UINavigationControllerメインクラス xibのクラスを として設定しますCustomNavigationController。それがypuに役立つことを願っています..

于 2013-07-04T09:11:34.860 に答える
20

ビュー コントローラーは、アプリ自体でサポートされていない位置に回転することはありません。可能なすべての回転を有効にしてから、回転するはずのないView Controllerに次の行を追加する必要があります

- (UIInterfaceOrientationMask)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;
}

ChatView では、次のようになります。

- (UIInterfaceOrientationMask)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskAll;
}

ローテーション後にレイアウトを変更する必要がある場合は、サブビューに適切な変更を実装する必要があります

- (void)viewWillLayoutSubviews

は回転後に変化しないため、self.view.boundsの現在のサイズを確認するために使用します。viewself.view.frame

于 2013-07-04T09:15:06.677 に答える
17

viewcontroller.m回転させたい特定の

このメソッドを追加します。

- (BOOL)canAutoRotate
{
    return YES;
}

それからあなたの中にAppDelegate.m

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
    UIViewController *currentViewController = [self topViewController];

    if ([currentViewController respondsToSelector:@selector(canAutoRotate)]) {
        NSMethodSignature *signature = [currentViewController methodSignatureForSelector:@selector(canAutoRotate)];

        NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];

        [invocation setSelector:@selector(canAutoRotate)];
        [invocation setTarget:currentViewController];

        [invocation invoke];

        BOOL canAutorotate = NO;
        [invocation getReturnValue:&canAutorotate];

        if (canAutorotate) {
            return UIInterfaceOrientationMaskAll;
        }
    }

    return UIInterfaceOrientationMaskPortrait;
}

- (UIViewController *)topViewController
{
    return [self topViewControllerWithRootViewController:[UIApplication sharedApplication].keyWindow.rootViewController];
}

- (UIViewController *)topViewControllerWithRootViewController:(UIViewController *)rootViewController
{
    if ([rootViewController isKindOfClass:[UITabBarController class]]) {
        UITabBarController* tabBarController = (UITabBarController*)rootViewController;
        return [self topViewControllerWithRootViewController:tabBarController.selectedViewController];
    } else if ([rootViewController isKindOfClass:[UINavigationController class]]) {
        UINavigationController* navigationController = (UINavigationController*)rootViewController;
        return [self topViewControllerWithRootViewController:navigationController.visibleViewController];
    } else if (rootViewController.presentedViewController) {
        UIViewController* presentedViewController = rootViewController.presentedViewController;
        return [self topViewControllerWithRootViewController:presentedViewController];
    } else {
        return rootViewController;
    }
}
于 2014-08-26T14:11:13.380 に答える
4

テッドの答えは、ノルウェーのアレクサンダーが言及した問題とうまく機能します。しかし、アレクサンダーが説明したように問題が発生しているとは思えませんでした。

現在横向き (すべての向きが有効) になっている ViewController B が ViewController A に戻ると (縦向きのみ)、ユーザーが [戻る] ボタンをクリックした後、 supportedInterfaceOrientationsForWindow は呼び出されず、ViewController A は横向きになります。

実際、ユーザーが戻るボタンをクリックした後、現在横向き (すべての向きが有効) になっている ViewController B が ViewController A (縦向きのみ) に戻ると、Appdelegate

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation;

呼ばれています。ただし、ルートView ControllerはViewController B(回転が有効なView Controller)ですが、ViewController Bがまだ戻っているため、ViewController Aは縦向きに戻りません

-(BOOL)shouldAutorotate{

    return YES;
}

したがって、戻るボタンを押すと、ViewController B で「shouldAutorotate -> NO」になります。その後、ViewController A は縦向きになります。これは私がしたことです

@property (nonatomic, assign) BOOL canAutoRotate;

#pragma mark - Public methods
- (BOOL)canAutoRotate
{
    return _canAutoRotate;
}

#pragma mark - Button actions
- (void)backButtonPressed:(UIButton *)sender {
    _canAutoRotate = NO;
   (...)
}

#pragma mark - Init
- (id)init{
    if(self=[super init]) {
        _canAutoRotate = YES;
    }
    return self;
}
于 2015-02-25T09:54:45.753 に答える
2

この質問は非常に古いことは知っていますが、最新の回答が必要です。この結果を実現する最も簡単で正しい方法は、アプリの設定で縦向きと横向きを有効にすることです。次に、このコードをアプリのデリゲートに追加します。

 func application(application: UIApplication, supportedInterfaceOrientationsForWindow window: UIWindow?) -> UIInterfaceOrientationMask {

    if let navigationController = self.window?.rootViewController as? UINavigationController {

        if navigationController.visibleViewController is INSERTYOURVIEWCONTROLLERHERE  {
            return UIInterfaceOrientationMask.All
        }

        else {
            return UIInterfaceOrientationMask.Portrait
        }
    }

    return UIInterfaceOrientationMask.Portrait
}

「INSERTYOURVIEWCONTROLLERHERE」をView Controllerに置き換えることを忘れないでください。

于 2016-08-24T19:30:03.560 に答える
1

Swiftの Alexander ( https://stackoverflow.com/posts/25507963/revisions )の回答は次のとおりです。

func application(application: UIApplication, supportedInterfaceOrientationsForWindow window: UIWindow?) -> Int {

    var currentViewController: UIViewController? = self.topViewController()
    if currentViewController != nil && currentViewController!.canAutoRotate() {
        return Int(UIInterfaceOrientationMask.All.rawValue)
    }
    return Int(UIInterfaceOrientationMask.Portrait.rawValue)


}

func topViewController() -> UIViewController? {
    if UIApplication.sharedApplication().keyWindow != nil
    {
        return self.topViewControllerWithRootViewController(UIApplication.sharedApplication().keyWindow!.rootViewController!)
    }
    return nil
}

func topViewControllerWithRootViewController(rootViewController: UIViewController?) -> UIViewController? {
    if rootViewController == nil {
        return nil
    }
    if rootViewController!.isKindOfClass(UITabBarController) {
        var tabBarController: UITabBarController = (rootViewController as? UITabBarController)!
        return self.topViewControllerWithRootViewController(tabBarController.selectedViewController)
    }
    else {
        if rootViewController!.isKindOfClass(UINavigationController) {
            var navigationController: UINavigationController = (rootViewController as? UINavigationController)!
            return self.topViewControllerWithRootViewController(navigationController.visibleViewController)
        }
        else {
            if (rootViewController!.presentedViewController != nil) {
                var presentedViewController: UIViewController = rootViewController!.presentedViewController!
                return self.topViewControllerWithRootViewController(presentedViewController)
            }
            else {
                return rootViewController
            }
        }
    }
}

さらに、AppDelegate.swift に次のスニペットを追加する必要があります。

extension UIViewController {
func canAutoRotate() -> Bool {
    return false
}}

また、すべての回転を許可する ViewController には、次の関数を追加します。

override func canAutoRotate() -> Bool {
    return true
}
于 2015-08-15T04:23:34.777 に答える
1

@iAnum の回答に基づいて、自動回転と UIViewController クラスの検出を有効にしました。

これは、そうしないと、「特別なビュー コントローラー」に出入りすると、縦向きに正しくならず、サポートされていない向きで立ち往生するためです。

ランドスケープをサポートするビューが 1 つしかなかったため、カスタム ナビゲーション ビュー コントローラーにハードコーディングしました。

-(BOOL)shouldAutorotate
{
    return YES;
}

-(NSUInteger)supportedInterfaceOrientations
{
    //Access the current top object.
    UIViewController *viewController = [self.viewControllers lastObject];
    //Is it one of the landscape supported ones?
    if ([viewController isMemberOfClass:[SpecialViewController class]]) {
        return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight;
    } else
        return UIInterfaceOrientationMaskPortrait;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    //Access the current top object.
    UIViewController *viewController = [self.viewControllers lastObject];
    //Is it one of the landscape supported ones?
    if ([viewController isMemberOfClass:[SpecialViewController class]]) {
        return interfaceOrientation;
    } else
        return UIInterfaceOrientationIsPortrait(interfaceOrientation);
}

ここで議論されている VC のポッピングの問題がありますhttps://stackoverflow.com/a/15057537/1277350ここで、ランドスケープ中に押し戻しても方向メソッドが呼び出されないため、表示して閉じることで少しハックする必要がありますモーダル ビュー。

そして、willShowViewController を起動したい場合は、self.delegate = self を設定し、以下のコードと共に UINavigationControllerDelegate をカスタム ナビゲーション コントローラーに追加する必要があることを覚えておいてください。

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    return UIInterfaceOrientationPortrait;
}

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    UIApplication* application = [UIApplication sharedApplication];
    if (application.statusBarOrientation != UIInterfaceOrientationPortrait)
    {
        UIViewController *c = [[UIViewController alloc]init];
        [c.view setBackgroundColor:[UIColor clearColor]];
        [navigationController presentViewController:c animated:NO completion:^{
            [self dismissViewControllerAnimated:YES completion:^{
            }];
        }];
    }
}
于 2014-06-18T12:05:21.390 に答える
1

次のように UINavigationController のサブクラスを作成します。

MyNavigationController.h

#import <UIKit/UIKit.h>

@interface MyNavigationController : UINavigationController

@end

MyNavigationController.m

#import "MyNavigationController.h"
#import "ServicesVC.h"

@implementation MyNavigationController

-(BOOL)shouldAutorotate{

    return YES;
}

-(NSUInteger)supportedInterfaceOrientations{

    if ([[self.viewControllers lastObject] isKindOfClass:[ServicesVC class]]) {
        return UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight;
    }

    return UIInterfaceOrientationMaskAll;
}

@end

ビューコントローラーの名前が ServicesVC であると仮定します。

于 2014-11-26T19:42:34.853 に答える
0

アプリが IOS7 から IOS9 までをサポートしている場合、オリエンテーション次のコードを使用します。

#if __IPHONE_OS_VERSION_MAX_ALLOWED < 90000
- (NSUInteger)supportedInterfaceOrientations
#else
- (UIInterfaceOrientationMask)supportedInterfaceOrientations
#endif
{
    if([AppDelegate isPad]) return UIInterfaceOrientationMaskAll;
    else return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown;
}
于 2016-08-09T06:07:56.110 に答える
0

// このメソッドをアプリのデリゲート クラスに貼り付けます

- (UIInterfaceOrientationMask)application:(UIApplication )application supportedInterfaceOrientationsForWindow:(UIWindow )window
{
 if ([self.window.rootViewController.presentedViewController isKindOfClass: [_moviePlayerController class]])
  {
   if (self.window.rootViewController.presentedViewController)
        return UIInterfaceOrientationMaskAll;
    else return UIInterfaceOrientationMaskPortrait;
  }
 else return UIInterfaceOrientationMaskPortrait;
}   
于 2016-02-02T15:43:50.847 に答える