当方向改变时,viewcontroller的iOS部分变为黑色

当方向改变时,viewcontroller的iOS部分变为黑色,ios,uitableview,screen-orientation,uiinterfaceorientation,device-orientation,Ios,Uitableview,Screen Orientation,Uiinterfaceorientation,Device Orientation,当我在加载特定方向时更改viewcontroller方向时,屏幕底部的一部分变为空白 复制步骤: 在视图控制器中有tableview(我想没有必要,可以是任何视图) 推一个新的viewcontroller,它也有一个tableview(我想没有必要,可以是任何视图) 行动 将屏幕从一个方向旋转到另一个方向(从纵向到横向或从横向到纵向)。现在您将能够看到黑暗部分 按“上一步”按钮弹出当前的viewcontroller 现在从一个方向旋转到另一个方向(从纵向到横向或从横向到纵向)。现在你也可以看到这

当我在加载特定方向时更改viewcontroller方向时,屏幕底部的一部分变为空白

复制步骤:

  • 在视图控制器中有tableview(我想没有必要,可以是任何视图)
  • 推一个新的viewcontroller,它也有一个tableview(我想没有必要,可以是任何视图) 行动
  • 将屏幕从一个方向旋转到另一个方向(从纵向到横向或从横向到纵向)。现在您将能够看到黑暗部分
  • 按“上一步”按钮弹出当前的viewcontroller
  • 现在从一个方向旋转到另一个方向(从纵向到横向或从横向到纵向)。现在你也可以看到这里的黑暗部分
  • viewcontroller的底部变为黑色

    我能复制10次中的7次

    供参考:

    我的Viewcontroller只有tableview,所有单元格都有自动布局约束。 试图理解它为什么会发生,我想修复它

    有关复制问题的更多详细信息:

    基本上,只有当您将设备保持在倾斜位置并按下或弹出视图控制器时,您才能重现此问题。当页面尝试加载时,您必须更改方向,然后问题才会发生

    (双关语…哈哈) 换句话说,你必须倾斜你的设备,就像你在操纵方向盘一样:)


    这个问题只有当你像方向盘一样使用你的设备时才会发生:)

    我也遇到过同样的问题

    我的视图控制器只有一个tableview,当我们倾斜时,我的意思是在导航推送或弹出过程中改变方向,这种情况过去经常发生

    尝试设置框架 在
    viewdilayoutsubviews

       -(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);
        }
    }
    
    或者尝试在
    viewwillTransitionOnToSize

    -(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);
        }
    }
    
    -(void)视图将转换大小:(CGSize)带有转换协调器的大小:(id)协调器{
    [super ViewWillTransitionSize:size with TransitionCoordinator:coordinator];
    CGRect屏幕=[[UIScreen mainScreen]边界];
    CGFloat WITH=CGRECTGETWITH(屏幕);
    CGFloat height=CGRectGetHeight(屏幕);
    CGRect frame=self.tableView.frame;
    如果(CGRectGetHeight(帧)!=高度和&CGRectGetWidth(帧)!=宽度){
    self.tableView.frame=CGRectMake(0,0,宽度,高度);
    }
    }
    
    供参考:

    如果设置帧
    self.tableView.frame=CGRectMake(0,0,宽度,高度)不起作用,然后您可以尝试在中再次设置帧

    viewDidLayoutSubviews


    在viewWillTransition方法中,调用layoutifneed()

    尝试使用此方法重置旋转后TableView的布局

        override func viewWillLayoutSubviews() {
            super.viewWillLayoutSubviews()
            tableView.layoutIfNeeded()
        }
    



    在一个视图控制器(推送新视图控制器的父视图)中,将帧设置为viewDidLayoutSubviews可以解决另一个视图控制器(推送的子视图控制器)中的问题将框架设置为viewWillTransition可以解决问题:),但我仍然不知道为什么没有通用的解决方案来解决这个问题。

    这是否回答了您的问题?我只是在viewcontroller中使用tableview,没有其他元素,每个tableview单元格都有自动布局约束。。。所以我不需要自己更新框架。我仍在想还有什么原因会导致这种情况考虑添加屏幕快照您能否共享此
    UIViewController
    的一些代码?显示您的TableView的约束它在我的一个视图控制器中工作,而在其他视图控制器中不工作it’s奇怪。你能在tableview和屏幕的宽度和高度的代码段中放一些NSLog,看看发生了什么吗?我试着在这个区域周围放一些日志。这是我发现的,当这个问题在这个特定的viewcontroller中发生时,viewDidLayoutSubviews和viewWillLayoutSubviews都没有被调用。我在另一个视图控制器中遇到了页面黑暗问题的相同部分。通过使用上面的代码片段,问题得到了解决,并且调用了LayoutSubView,这就是问题得到解决的原因。我想知道为什么没有为这个特定的视图控制器调用这些代理?尝试调用ViewWillTransitionOnToSize:(CGSize)size with TransitionCoordinator:(id)协调器并设置框架当我使用自动布局时,为什么我要担心框架的大小?@dineshR在这里,您可以在转换之前获得框架大小。因此,您的视图没有更新。转换完成后,需要获取帧大小。您也可以使用此方法“viewWillTransition”进行此操作。我可以不设置帧,而是激活自动布局以重新绘制吗?@dineshR如果自动布局以重新绘制有效,则可以使用此选项。您可以调用layoutIfNeeded,查看当问题发生时是否未调用该帮助Sit OK,您希望允许哪个ViewController旋转?ViewController旋转没有问题,它会旋转,但有时,在方向更改期间,页面底部会变暗,请查看复制步骤。我的问题是,出现此问题时,不会调用viewDidLayoutSubviews或viewWillLayoutSubviews。请在viewWillTransition调用setNeedsLayout()中尝试此操作,然后调用LayoutFneeded()。设置表框可在一个视图控制器(viewWillTransition)中修复此问题,谢谢,而在另一个视图控制器中则无法使用。奇怪。顺便说一下,setNeedsLayout是异步的,view必须等待下一个UI更新周期,而LayoutIfNeed是同步的。无论如何,这两个都不起作用
        override func viewDidLayoutSubviews() {
            super.viewDidLayoutSubviews()
            tableView.layoutIfNeeded()
        }