我试图旋转一个视图,而所有其他视图(5)都固定为纵向。原因是,在这一视图中,我希望用户观看他之前保存的图片。我想这是可能的,但到目前为止我还不知道如何做到这一点。有谁能帮我或给我一个提示吗?我正在用iOS8上的Swift进行编程
有时,当您使用自定义导航流(可能会变得非常复杂)时,上述解决方案可能并不总是有效。此外,如果您有几个需要支持多个方向的ViewController,它可能会变得非常乏味。
这是我找到的一个相当快速的解决方案。定义一个类OrientationManager
并使用它来更新AppServer中支持的方向:
class OrientationManager {
static var landscapeSupported: Bool = false
}
然后将您想要的特定情况下的方向:
func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
if OrientationManager.landscapeSupported {
return .allButUpsideDown
}
return .portrait
}
然后,在要进行多个导航的视图控制器中,更新方向管理器:
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
OrientationManager.landscapeSupported = true
}
此外,在退出此ViewController时,不要忘记再次更新它:
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
OrientationManager.landscapeSupported = false
//The code below will automatically rotate your device's orientation when you exit this ViewController
let orientationValue = UIInterfaceOrientation.portrait.rawValue
UIDevice.current.setValue(orientationValue, forKey: "orientation")
}
希望这有帮助!
更新:
您可能只想将静态func
添加到您的方向支持管理器
类:
static func setOrientation(_ orientation: UIInterfaceOrientation) {
let orientationValue = orientation.rawValue
UIDevice.current.setValue(orientationValue, forKey: "orientation")
landscapeSupported = orientation.isLandscape
}
然后,您可以在需要将方向设置回纵向时调用此函数。这也将更新静态的landscapeSupported值:
OSM.setOrientation(.portrait)
您也可以以面向协议的方式执行此操作。只需创建协议
protocol CanRotate {
}
以更“迅速”的方式在AppServer ate中添加相同的2个方法
func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
if topViewController(in: window?.rootViewController) is CanRotate {
return .allButUpsideDown
} else {
return .portrait
}
}
func topViewController(in rootViewController: UIViewController?) -> UIViewController? {
guard let rootViewController = rootViewController else {
return nil
}
if let tabBarController = rootViewController as? UITabBarController {
return topViewController(in: tabBarController.selectedViewController)
} else if let navigationController = rootViewController as? UINavigationController {
return topViewController(in: navigationController.visibleViewController)
} else if let presentedViewController = rootViewController.presentedViewController {
return topViewController(in: presentedViewController)
}
return rootViewController
}
在每个需要不同行为的ViewController中,只需在类的定义中添加协议名称。
class ViewController: UIViewController, CanRotate {}
如果需要任何特定的组合,可以向协议中添加一个变量以覆盖
protocol CanRotate {
var supportedInterfaceOrientations: UIInterfaceOrientationMask
}
我建议在您的appDelegate中使用SupportedInterfaceDirectionsforWindow,以仅允许在特定视图控制器中旋转,例如:
Swift 4/Swift 5
func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
// Make sure the root controller has been set
// (won't initially be set when the app is launched)
if let navigationController = self.window?.rootViewController as? UINavigationController {
// If the visible view controller is the
// view controller you'd like to rotate, allow
// that window to support all orientations
if navigationController.visibleViewController is SpecificViewController {
return UIInterfaceOrientationMask.all
}
// Else only allow the window to support portrait orientation
else {
return UIInterfaceOrientationMask.portrait
}
}
// If the root view controller hasn't been set yet, just
// return anything
return UIInterfaceOrientationMask.portrait
}
请注意,如果在转到纵向屏幕之前,SpecificViewController处于横向,则另一个视图仍将在横向中打开。为了避免这种情况,我建议在视图处于横向时不允许过渡。
雨燕3
func application(application: UIApplication, supportedInterfaceOrientationsForWindow window: UIWindow?) -> Int {
// Make sure the root controller has been set
// (won't initially be set when the app is launched)
if let navigationController = self.window?.rootViewController as? UINavigationController {
// If the visible view controller is the
// view controller you'd like to rotate, allow
// that window to support all orientations
if navigationController.visibleViewController is SpecificViewController {
return Int(UIInterfaceOrientationMask.All.rawValue)
}
// Else only allow the window to support portrait orientation
else {
return Int(UIInterfaceOrientationMask.Portrait.rawValue)
}
}
// If the root view controller hasn't been set yet, just
// return anything
return Int(UIInterfaceOrientationMask.Portrait.rawValue)
}
问题内容: 我正在尝试旋转一个视图,而所有其他视图(5)都固定为纵向。原因是在该视图中,我希望用户观看以前保存的图片。我想这是可能的,但到目前为止我还不知道如何实现。谁能帮忙或给我提示吗?我正在在iOS8上运行的Swift中编程 问题答案: 这是针对 Swift 3和Swift 4的 。您可以在AppDelegate.swift中使用以下代码: 您可以在原始帖子中了解更多信息:http : //w
问题内容: 我刚开始使用快速语言,并且知道这个问题是重复的。我发现了几个类似的问题和答案,但我无法弄清这个问题。 我想将ScandString变量的值从ScanViewController传递给ResultViewController。 ScanViewcontroller如下: ResultViewController如下: println(detectedString)没有给我任何结果。问题是
问题内容: 我有以下内容: 我如何从另一个ViewController 访问? 我需要访问此功能: 问题答案: 默认情况下,swift中的所有内容都是公开的,因此,如果您声明以下内容: 只要拥有它的实例,就可以访问它:
问题内容: 问题 我开始浏览上的新功能,并尝试了一些演示项目和教程。现在我被困在: 实例化,然后呈现特定情节提要中的 Objective-C解决方案 如何在Swift上实现这一目标? 问题答案: 这个答案最近针对Swift 5.2和iOS 13.4 SDK进行了修订。 这都是新语法和稍微修改的API的问题。UIKit的基本功能没有改变。对于绝大多数iOS SDK框架来说都是如此。 如果您遇到问题,
我有一个自定义的,我希望将作为从一传递到二(这是模态)。问题是,当我使用在之间切换时,函数不会被触发,因为处理我假设的转换。 那我该怎么做呢?如何将从一个传递到下一个。
问题内容: 我试图在横向模式下仅强制应用程序中的一个视图, 该视图以纵向模式启动,并且在更改设备方向时保持旋转。 从不调用shouldAutorotate。 任何帮助,将不胜感激。 问题答案: 它对其他人可能有用,我找到了一种强制视图以横向模式启动的方法: 把它放在viewDidLoad()中: 和,