为什么我的 iPad 布局不会在旋转时重新调整?
Why does my iPad layout not readjust upon rotation?
我有一个 iPad 的拆分视图控制器,它应该支持两个方向(纵向和横向)。
问题 是当我更改设备的方向时,详细信息视图不会重新调整以使用整个 space 并且会出现一个灰色方块。
我不认为约束有问题,因为这只会在我旋转时发生:
- 当我以纵向模式启动应用程序时,布局加载良好。
- 当我以横向模式启动应用程序时,布局加载良好。
在 SplitViewController(以及 DetailsController)中,我尝试了这段代码:
在viewDidLoad中:
NSNotificationCenter.defaultCenter().addObserver(self, selector: "rotated", name: UIDeviceOrientationDidChangeNotification, object: nil)
然后:
override func shouldAutorotate() -> Bool {
print("should rotate --> true")
return true
}
override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
print("we support all orientations")
return UIInterfaceOrientationMask.All
}
override func preferredInterfaceOrientationForPresentation() -> UIInterfaceOrientation {
print("preferred orientation for presentation is landscape")
return UIInterfaceOrientation.LandscapeLeft
}
func rotated(){
print("rotatiooooonn ------------")
refreshIpad()
detailSplitViewController.refreshUI()
}
func refreshIpad (){
dispatch_async(dispatch_get_main_queue(),{
self.view.setNeedsLayout()
})
}
在日志中我得到了这个(所以我可以在方向发生变化时看到)
should rotate --> true
we support all orientations
rotatiooooonn ------------
以下是信息文件:
编辑
故事板:
详细信息视图中的约束:
在 refreshIpad()
中,您需要为所有子视图显式调用 setNeedsLayout()
,因为它不会递归发生,
func refreshIpad() {
dispatch_async(dispatch_get_main_queue(),{
self.view.setNeedsLayout()
for subview in self.view.subviews {
subview.setNeedsLayout()
}
})
}
递归求解(Swift3.0)
extension UIView {
func setNeedsLayoutForSubviews() {
self.subviews.forEach({
[=11=].setNeedsLayout()
[=11=].setNeedsLayoutForSubviews()
})
}
}
func refreshIpad() {
DispatchQueue.main.async {
self.view.setNeedsLayout()
self.view.setNeedsLayoutForSubviews()
}
}
我有一个 iPad 的拆分视图控制器,它应该支持两个方向(纵向和横向)。
问题 是当我更改设备的方向时,详细信息视图不会重新调整以使用整个 space 并且会出现一个灰色方块。
我不认为约束有问题,因为这只会在我旋转时发生:
- 当我以纵向模式启动应用程序时,布局加载良好。
- 当我以横向模式启动应用程序时,布局加载良好。
在 SplitViewController(以及 DetailsController)中,我尝试了这段代码:
在viewDidLoad中:
NSNotificationCenter.defaultCenter().addObserver(self, selector: "rotated", name: UIDeviceOrientationDidChangeNotification, object: nil)
然后:
override func shouldAutorotate() -> Bool {
print("should rotate --> true")
return true
}
override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
print("we support all orientations")
return UIInterfaceOrientationMask.All
}
override func preferredInterfaceOrientationForPresentation() -> UIInterfaceOrientation {
print("preferred orientation for presentation is landscape")
return UIInterfaceOrientation.LandscapeLeft
}
func rotated(){
print("rotatiooooonn ------------")
refreshIpad()
detailSplitViewController.refreshUI()
}
func refreshIpad (){
dispatch_async(dispatch_get_main_queue(),{
self.view.setNeedsLayout()
})
}
在日志中我得到了这个(所以我可以在方向发生变化时看到)
should rotate --> true
we support all orientations
rotatiooooonn ------------
以下是信息文件:
编辑
故事板:
详细信息视图中的约束:
在 refreshIpad()
中,您需要为所有子视图显式调用 setNeedsLayout()
,因为它不会递归发生,
func refreshIpad() {
dispatch_async(dispatch_get_main_queue(),{
self.view.setNeedsLayout()
for subview in self.view.subviews {
subview.setNeedsLayout()
}
})
}
递归求解(Swift3.0)
extension UIView {
func setNeedsLayoutForSubviews() {
self.subviews.forEach({
[=11=].setNeedsLayout()
[=11=].setNeedsLayoutForSubviews()
})
}
}
func refreshIpad() {
DispatchQueue.main.async {
self.view.setNeedsLayout()
self.view.setNeedsLayoutForSubviews()
}
}