【发布时间】:2016-07-31 14:28:55
【问题描述】:
我要做什么:
由父视图控制器管理的父视图不应旋转。
由子视图控制器管理的子视图应该旋转到所有方向。
我的尝试:
父视图控制器
override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
return .Portrait
}
override func shouldAutorotate() -> Bool {
return true
}
fun addChildViewController() {
let storyBoard = UIStoryboard(name: "Main", bundle: nil)
self.childViewController = storyBoard("Child View Controller") as? ChildViewController
self .addChildViewController(self.childViewController!)
self.childViewController! .didMoveToParentViewController(self)
self.view .addSubview(self.childViewController!.view)
self.childViewController!.view.frame = CGRectMake (40, 200, 400, 250)
}
ChildViewController
override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
return .All
}
override func shouldAutorotate() -> Bool {
return true
}
Xcode 部署信息中支持的方向设置为全部四个。
我得到了什么:
视图没有旋转。如果我将父级的旋转设置为全部,则所有视图一起旋转。所以要么全有,要么全无。
更新
当我尝试为 UIDeviceOrientationDidChangeNotification 放置一个观察者并使用 UIDevice.currentDevice().orientation 使用 CGAffaineTransformMakeRotate 旋转 childView 时,我得到了想要的结果。但是,即,如果我旋转到横向,并尝试下拉通知中心(或者如果我收到系统通知),它仍然是纵向的(因为应用程序本身仍然是纵向的),旋转 childView 旋转回纵向以尊重状态栏/通知/通知中心。
Stock iOS Camera App 是我能展示的最佳示例。主画布不会旋转到不同的方向,但在幕后,状态栏会根据设备旋转进行旋转。此外,子视图在它们内部旋转以尊重不同的方向。我正在尝试实现这种行为....
【问题讨论】:
-
不确定这是否可行,把它当作一个想法。我肯定会将应用程序设置为仅支持一个(纵向)方向,然后我会尝试检测设备(而不是屏幕)的旋转并通过手动旋转屏幕中间的视图来响应它。我猜
viewWillTransition(to:with:)不起作用,所以你需要找到一个合适的解决方案。 -
您的意思是使用 CGAffineTransform 之类的东西进行旋转?
-
是的,正是 CGAffineTransform。你有一个有趣的情况。很乐意提供帮助并实际尝试编写一些代码来解决这个问题,但我担心我会很忙,所以我不能在这里弄脏我的手。
-
好吧,我将 CGAffineTransform 旋转方法作为 Z 计划。我很惊讶上面的代码无法正常工作。它只是不会将“shouldAutorotate()”传递给视图控制器。
-
请注意,由于 iOS 8 中自动旋转的底层实现发生了变化,在应用程序的窗口中添加子视图可能不再是一种有效的技术:developer.apple.com/library/ios/qa/qa1890/_index.html
标签: swift xcode uiviewcontroller landscape-portrait childviewcontroller