iOS 方向改变时 viewcontroller 的一部分变黑
iOS part of viewcontroller goes black when orientation changes
当我在特定方向加载时更改 viewcontroller 方向时,部分屏幕在底部变为空白。
重现步骤:
- 在视图控制器中有表视图(我认为没有必要。可以是任何视图)
- 推一个新的viewcontroller,它也有一个表视图(我认为没有必要。可以是任何视图)
一个动作
- 将屏幕从一个方向旋转到另一个方向(纵向到横向或横向到纵向)。现在您将能够看到黑暗部分。
- 按后退按钮弹出当前 viewcontroller
- 现在从一个方向旋转到另一个方向(纵向到横向或横向到纵向)。现在您也可以在这里看到黑暗部分。
viewcontroller 的底部变黑。
10次我能复现7次
仅供参考:
我的 Viewcontroller 只有 tableview 而已,所有单元格都有自动布局约束。
试图了解它发生的原因,我想修复它。
有关重现问题的更多详细信息:
基本上,只有当您将设备保持在倾斜位置并按下或弹出视图控制器时,您才能重现此问题,并且在尝试加载页面时,您必须更改方向,然后问题才会发生。
(双关语....大声笑)
换句话说,你必须倾斜你的设备,就像你在操纵方向盘一样:)。
只有当您像方向盘一样使用设备时才会发生此问题:)
我也遇到了同样的问题。
我的视图控制器只有一个表视图,当我们倾斜时,我的意思是在导航推送或弹出期间改变方向,这曾经发生过。
尝试设置框架
在 viewDidLayoutSubviews
-(void)viewDidLayoutSubviews{
CGRect screen = [[UIScreen mainScreen] bounds];
CGFloat width = CGRectGetWidth(screen);
CGFloat height = CGRectGetHeight(screen);
CGRect frame = self.tableView.frame;
// To check if there's any mismatch between the sizes of screen and tableview then set the tableview frame same as screen frame.
if (CGRectGetHeight(frame) != height && CGRectGetWidth(frame) != width) {
self.tableView.frame = CGRectMake(0, 0, width, height);
}
}
或尝试在 viewWillTransitionToSize
中设置框架
-(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator{
[super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
CGRect screen = [[UIScreen mainScreen] bounds];
CGFloat width = CGRectGetWidth(screen);
CGFloat height = CGRectGetHeight(screen);
CGRect frame = self.tableView.frame;
if (CGRectGetHeight(frame) != height && CGRectGetWidth(frame) != width) {
self.tableView.frame = CGRectMake(0, 0, width, height);
}
}
仅供参考:
如果设置框架 self.tableView.frame = CGRectMake(0, 0, width, height);
不起作用,那么您可以尝试 [self.tableView layoutIfNeeded]
在
中再次设置框架
viewDidLayoutSubviews
在您的 viewWillTransition 方法中调用 layoutIfNeeded()
尝试使用此方法重置TableView旋转后的布局,
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
tableView.layoutIfNeeded()
}
或
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
tableView.layoutIfNeeded()
}
在一个视图控制器(推动新视图控制器的父视图控制器)中将框架设置为 viewDidLayoutSubviews 解决了另一个视图控制器(子视图控制器,正在获取的视图控制器)中的问题推)在 viewWillTransition 处设置框架可以解决问题 :) 但我仍然不知道为什么没有通用的解决方案来解决这个问题。
当我在特定方向加载时更改 viewcontroller 方向时,部分屏幕在底部变为空白。
重现步骤:
- 在视图控制器中有表视图(我认为没有必要。可以是任何视图)
- 推一个新的viewcontroller,它也有一个表视图(我认为没有必要。可以是任何视图) 一个动作
- 将屏幕从一个方向旋转到另一个方向(纵向到横向或横向到纵向)。现在您将能够看到黑暗部分。
- 按后退按钮弹出当前 viewcontroller
- 现在从一个方向旋转到另一个方向(纵向到横向或横向到纵向)。现在您也可以在这里看到黑暗部分。
viewcontroller 的底部变黑。
10次我能复现7次
仅供参考:
我的 Viewcontroller 只有 tableview 而已,所有单元格都有自动布局约束。 试图了解它发生的原因,我想修复它。
有关重现问题的更多详细信息:
基本上,只有当您将设备保持在倾斜位置并按下或弹出视图控制器时,您才能重现此问题,并且在尝试加载页面时,您必须更改方向,然后问题才会发生。
(双关语....大声笑) 换句话说,你必须倾斜你的设备,就像你在操纵方向盘一样:)。
只有当您像方向盘一样使用设备时才会发生此问题:)
我也遇到了同样的问题。
我的视图控制器只有一个表视图,当我们倾斜时,我的意思是在导航推送或弹出期间改变方向,这曾经发生过。
尝试设置框架
在 viewDidLayoutSubviews
-(void)viewDidLayoutSubviews{
CGRect screen = [[UIScreen mainScreen] bounds];
CGFloat width = CGRectGetWidth(screen);
CGFloat height = CGRectGetHeight(screen);
CGRect frame = self.tableView.frame;
// To check if there's any mismatch between the sizes of screen and tableview then set the tableview frame same as screen frame.
if (CGRectGetHeight(frame) != height && CGRectGetWidth(frame) != width) {
self.tableView.frame = CGRectMake(0, 0, width, height);
}
}
或尝试在 viewWillTransitionToSize
-(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator{
[super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
CGRect screen = [[UIScreen mainScreen] bounds];
CGFloat width = CGRectGetWidth(screen);
CGFloat height = CGRectGetHeight(screen);
CGRect frame = self.tableView.frame;
if (CGRectGetHeight(frame) != height && CGRectGetWidth(frame) != width) {
self.tableView.frame = CGRectMake(0, 0, width, height);
}
}
仅供参考:
如果设置框架 self.tableView.frame = CGRectMake(0, 0, width, height);
不起作用,那么您可以尝试 [self.tableView layoutIfNeeded]
在
中再次设置框架viewDidLayoutSubviews
在您的 viewWillTransition 方法中调用 layoutIfNeeded()
尝试使用此方法重置TableView旋转后的布局,
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
tableView.layoutIfNeeded()
}
或
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
tableView.layoutIfNeeded()
}
在一个视图控制器(推动新视图控制器的父视图控制器)中将框架设置为 viewDidLayoutSubviews 解决了另一个视图控制器(子视图控制器,正在获取的视图控制器)中的问题推)在 viewWillTransition 处设置框架可以解决问题 :) 但我仍然不知道为什么没有通用的解决方案来解决这个问题。