我完成了我的iOS应用程序,但我只需要将一个视图设置为横向模式,其余视图只能在纵向模式下查看。
我正在使用Xcode 5.1,我通过从右侧面板中删除我的故事板视图控制器来创建我的所有视图,所以如果你要告诉我在某处写一些代码,请告诉我我需要的确切位置写下来。
我在这里阅读了一个解决方案UINavigationController Force Rotate,但我不知道在哪里编写该代码。我是否需要手动创建一个UIViewController
?
答案 0 :(得分:89)
<强>夫特强>
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
<强>目标C 强>
AppDelegate.h
@property (assign, nonatomic) BOOL shouldRotate;
AppDelegate.m
- (UIInterfaceOrientationMask)application:(UIApplication *)application
supportedInterfaceOrientationsForWindow:(UIWindow *)window {
return self.shouldRotate ? UIInterfaceOrientationMaskAllButUpsideDown
: UIInterfaceOrientationMaskPortrait;
}
您的横向视图控制器
AppDelegate *appDelegate = [UIApplication sharedApplication].delegate;
[appDelegate setShouldRotate:YES]; // or NO to disable rotation
答案 1 :(得分:38)
我想你在这里瞄准iOS 7(使用XCode 5.1,我认为我是对的)。
首先,您必须了解,为了打开40多个景观中的一个视图,您的应用应该允许横向和纵向界面方向。
默认情况下是这种情况,但您可以在目标设置General
标签,Deployment Info
部分进行检查(参见下面的屏幕截图)。
然后,因为您允许整个应用程序使用横向和纵向,所以您必须告诉每个仅限纵向的UIViewController
它不应该自动旋转,添加此方法的实现:
- (BOOL)shouldAutorotate {
return NO;
}
最后,对于您的特定横向控制器,并且因为您说您以模态方式呈现它,您可以实现这些方法:
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
return UIInterfaceOrientationLandscapeLeft; // or Right of course
}
- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskLandscape;
}
希望这会有所帮助,
答案 2 :(得分:6)
要跟进Yaroslav的解决方案,为了只允许在一个视图中旋转到横向模式,横向视图控制器应在其viewWillAppear方法中将shouldRotate设置为YES,并在其viewWillDisappear中设置为NO。 / p>
如果在viewWillAppear中仅将ShowShouldRotate设置为YES,则在现有此视图控制器之后,所有其他视图控制器也将被旋转。因此,您必须在其viewWillDisappear中将SetShouldRotate设置为NO以限制纵向视图旋转。
答案 3 :(得分: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)
}
答案 4 :(得分:1)
您应该将shouldRotate声明为内部,以便在没有公共类警告的情况下摆脱公共属性。 internal var shouldRotate = false