it-swarm.com.ru

Как заставить или отключить ориентацию интерфейса для некоторых, но не для всех UIViewController?

У меня есть приложение с 9-10 экранами. Я встроил UINavigationController в свой контроллер представления. У меня мало контроллеров вида, которые я хочу установить только в портретной ориентации: это означает, что вращение устройства не должно переводить эти контроллеры вида в альбомный режим. Я пробовал следующие решения:

первый:

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

но экран по-прежнему поворачивается в ландшафт.

Второе: Я создал собственный класс контроллера представления как PortraitViewController и добавил код ниже в PortraitViewController.m

@interface PortraitViewController ()
@end

@implementation PortraitViewController
- (BOOL)shouldAutorotate
{
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations
{
    //Here check class name and then return type of orientation
    return UIInterfaceOrientationMaskPortrait;
}
@end

После этого я реализовал PortraitViewController.h как базовый класс

#import <UIKit/UIKit.h>
#import "PortraitViewController.h"
@interface Login : PortraitViewController
@end

Это не работает вообще, все еще позволяет контроллеру представления вращаться в альбомном режиме.

Есть ли другое решение, которое я использую iOS 8 и не хочу, чтобы viewcontroller вращался в ландшафтном режиме?

Правка: Возможно ли иметь альбомную ориентацию только для некоторых контроллеров представления и заставить ориентацию других контроллеров представления придерживаться Портрета?

11
TechGuy

Попробуйте создать подкласс UINavigationController, который вы используете, потому что UINavigationController по умолчанию не передает метод shouldAutorotate вашему viewcontroller.

Реализуйте следующий метод в своем подклассе UINavigationController

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

Теперь UINavigationController перенаправляет вызов метода в его текущий видимый UIViewController, поэтому вам нужно реализовать shouldAutorotate там отдельно, чтобы получить желаемый эффект.

7
JulianM

Попробуйте добавить этот метод вместе с shouldAutorotate и supportedInterfaceOrientations

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
//Setting the orientation of the view.  I've set it to portrait here.
return UIInterfaceOrientationPortrait;

}

Также вы можете использовать этот [UIViewController attemptRotationToDeviceOrientation] так, чтобы он вращался в желаемой новой ориентации

5
iPP

Ваш PortraitViewController в порядке, и я не знаю вашу конфигурацию раскадровки. В вашем случае важно то, что вы должны встроить целевой контроллер представления в другой новый контроллер навигации, затем установить его класс в свой PortraitViewController и представить эту навигацию модально, как я сделал на рисунке ниже, и он работает, как и ожидалось.

 enter image description here

Если вы хотите показать анимацию, которая сделает анимацию презентации, как Push анимация

Ниже мой подкласс PortrateNavigation UINavigationController

PortrateNavigation.h

#import <UIKit/UIKit.h>

@interface PortrateNavigation : UINavigationController

@end

PortrateNavigation.m

#import "PortrateNavigation.h"

@implementation PortrateNavigation

- (void)viewDidLoad  {
    [super viewDidLoad];
}

- (BOOL)shouldAutorotate {
    return YES;
}

- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskPortrait;
}

@end
5
Anand Suthar

Создайте категорию в UINavigationController и переопределите supportedInterfaceOrientations

#import "UINavigationController+Orientation.h"

 @implementation UINavigationController (Orientation)

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

-(BOOL)shouldAutorotate
 {
    return YES;
 }

@end  

Когда вы внедрили UINavigationController, контейнеры не спрашивают своих детей, вращаться или нет

3
M.Alatrash

Вы должны сделать это вручную. Все контроллеры представления, в которых вы не хотите вращать представление, реализуют следующий метод.

- (BOOL)shouldAutorotate
{
    return NO;
}
1
VRAwesome

1) Создайте переменную bool в вашем AppDelegate. 

2) Затем скопируйте и вставьте приведенный ниже код в AppDelegate.m (измените его в соответствии с вашими требованиями)

-(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window{NSLog(@"%d", [UIDevice currentDevice].orientation)

if (self.isLandscape == YES) //bool created in first step
{
    return  UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight;
}

return UIInterfaceOrientationMaskPortrait;
}

3) Теперь скопируйте и вставьте приведенный ниже код в метод viewWillAppear контроллера представления, для которого вы хотите установить ориентацию.

[AppDelegate sharedAppDelegate].isLandscape = YES; //bool created in first step
 NSNumber *value1 = [NSNumber numberWithInt:UIInterfaceOrientationLandscapeRight]; //change the orientation as per your requirement
[[UIDevice currentDevice] setValue:value1 forKey:@"orientation"];

4) Теперь, прежде чем нажать этот контроллер вида, вам нужно сначала установить bool. Итак, допустим, вы хотите нажать ABC view controller 

[AppDelegate sharedAppDelegate].isLandscape = YES;
[self.navigationController pushViewController:<ABC view controller instance> animated:NO];

Надеюсь это поможет!!

1
Manish Verma

Tr это по вашему мнению контроллер

- (BOOL)shouldAutorotate{
    return NO;
}

- (NSUInteger)supportedInterfaceOrientations{
    return UIInterfaceOrientationPortrait |
           UIInterfaceOrientationPortraitUpsideDown;
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation{
    return UIInterfaceOrientationPortrait;
}
1
Raman soni
class ViewController: UIViewController {
    override func shouldAutorotate() -> Bool {
        return false
    }
}

Вот ссылка на тему: http://koreyhinton.com/blog/lock-screen-rotation-in-ios8.html

0
Pawel Molodkin

Если вы хотите временно отключить автоматическое вращение, избегайте манипуляций с масками ориентации. Вместо этого переопределите метод shouldAutorotate на начальном контроллере представления. Этот метод вызывается перед выполнением любого авторотации. Если он возвращает NO, то вращение подавляется.

Поэтому вам нужно создать подкласс UINavigationController, реализовать shouldAutorotate и использовать класс контроллера навигации в своей раскадровке.

- (BOOL)shouldAutorotate

{

id currentViewController = self.topViewController;


 if ([currentViewController isKindOfClass:[DetailViewController class]])
    return NO;

return YES;

}

альтернативный подход можно найти на

http://www.sebastianborggrewe.de/only-make-one-single-view-controller-rotate/

0
Divjot Singh Sandhu