Только ландшафтный режим ОДИН ВИД
Я закончил приложение iOS, но мне нужно установить только ОДИН вид в альбомный режим, остальные виды можно увидеть только в портретном режиме.
Я использую Xcode 5.1, и я создал все свои представления, отбросив в своем раскадровке View Controllers с правой панели, поэтому, если вы собираетесь мне где-нибудь написать какой-нибудь код, скажите мне, где именно мне нужно напишите.
Я прочитал одно решение здесь UINavigationController Force Rotate, но я не знаю, где написать этот код. Мне нужно создать один UIViewController
вручную?
Ответы
Ответ 1
Я предполагаю, что вы ориентируетесь на iOS 7 здесь (используя XCode 5.1, я думаю, что я прав).
Во-первых, вы должны понимать, что для того, чтобы открыть хотя бы один вид из более чем 40 пейзажа, ваше приложение должно учитывать ориентацию ландшафта и портфолио.
Это по умолчанию, но вы можете проверить его в своих целевых настройках, вкладке General
, Deployment Info
(см. Снимок экрана ниже).
![enter image description here]()
Затем, поскольку вы разрешили как пейзаж, так и портрет для всего приложения, вам нужно будет сказать только портрет-только UIViewController
, что он не должен авторотировать, добавив эту реализацию метода:
- (BOOL)shouldAutorotate {
return NO;
}
Наконец, для вашего конкретного контроллера только для ландшафта, и поскольку вы сказали, что представляете его в виде модальности, вы можете просто реализовать эти методы:
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
return UIInterfaceOrientationLandscapeLeft; // or Right of course
}
- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskLandscape;
}
Надеюсь, это поможет,
Ответ 2
стриж
AppDelegate.swift
internal var shouldRotate = false
func application(_ application: UIApplication,
supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
return shouldRotate ? .allButUpsideDown : .portrait
}
Ваш контроллер ландшафтного вида
let appDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.shouldRotate = true // or false to disable rotation
Objective-C
AppDelegate.h
@property (assign, nonatomic) BOOL shouldRotate;
AppDelegate.m
- (UIInterfaceOrientationMask)application:(UIApplication *)application
supportedInterfaceOrientationsForWindow:(UIWindow *)window {
return self.shouldRotate ? UIInterfaceOrientationMaskAllButUpsideDown
: UIInterfaceOrientationMaskPortrait;
}
Ваш контроллер ландшафтного вида
AppDelegate *appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
[appDelegate setShouldRotate:YES]; // or NO to disable rotation
Ответ 3
Чтобы следовать решению Ярослава, чтобы разрешить поворот в ландшафтный режим только в одном представлении, в контроллере ландшафтного представления должен быть установлен флажок mustRotate равным YES в его методе viewWillAppear и значением NO в его viewWillDisappear.
Если для viewWillAppear вы установите только значение YES в YES, после существования этого контроллера представления все другие контроллеры представления также будут поворачиваться. Таким образом, вы должны установитьShouldRotate в NO в его viewWillDisappear, чтобы ограничить поворот портретного представления.
Ответ 4
SWIFT4
Добавьте ниже строки кода в ваш AppDelegate
var orientationLock = UIInterfaceOrientationMask.portrait
func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
return self.orientationLock
}
struct AppUtility {
static func lockOrientation(_ orientation: UIInterfaceOrientationMask) {
if let delegate = UIApplication.shared.delegate as? AppDelegate {
delegate.orientationLock = orientation
}
}
static func lockOrientation(_ orientation: UIInterfaceOrientationMask, andRotateTo rotateOrientation:UIInterfaceOrientation) {
self.lockOrientation(orientation)
UIDevice.current.setValue(rotateOrientation.rawValue, forKey: "orientation")
}
}
Добавьте приведенный ниже код в контроллер, который вы хотите ландшафт
override func viewDidLoad() {
super.viewDidLoad()
}
override func viewWillAppear(_ animated: Bool) {
AppDelegate.AppUtility.lockOrientation(UIInterfaceOrientationMask.landscapeRight, andRotateTo: UIInterfaceOrientation.landscapeRight)
}
override func viewWillDisappear(_ animated : Bool) {
super.viewWillDisappear(animated)
AppDelegate.AppUtility.lockOrientation(UIInterfaceOrientationMask.portrait, andRotateTo: UIInterfaceOrientation.portrait)
}
Ответ 5
Вы должны объявить shouldRotate как внутреннее, чтобы избавиться от публичного свойства в отсутствии предупреждения общедоступного класса. internal var shouldRotate = false