Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/101.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 将视图控制器推到导航控制器上时旋转无法正确调整推送的视图控制器的大小_Ios_Objective C_Autolayout - Fatal编程技术网

Ios 将视图控制器推到导航控制器上时旋转无法正确调整推送的视图控制器的大小

Ios 将视图控制器推到导航控制器上时旋转无法正确调整推送的视图控制器的大小,ios,objective-c,autolayout,Ios,Objective C,Autolayout,我看到了一个非常奇怪的问题;当用户旋转设备时,将视图控制器推入导航控制器会导致推入的视图控制器不会自动布局到导航控制器 下面是一个演示,按下按钮将触发pushViewController: [ 首先,您可以看到推按按预期工作(无旋转),然后推按时弄乱(旋转),最后弹出时弄乱(旋转) 我特意做了一个我能想到的最简单的项目来测试这一点,因此故事板是一个带有导航控制器按钮的viewcontroller,整个代码是: - (void)didTapButton:(id)sender { UIVie

我看到了一个非常奇怪的问题;当用户旋转设备时,将视图控制器推入导航控制器会导致推入的视图控制器不会自动布局到导航控制器

下面是一个演示,按下按钮将触发pushViewController:

[

首先,您可以看到推按按预期工作(无旋转),然后推按时弄乱(旋转),最后弹出时弄乱(旋转)

我特意做了一个我能想到的最简单的项目来测试这一点,因此故事板是一个带有导航控制器按钮的viewcontroller,整个代码是:

- (void)didTapButton:(id)sender
{
    UIViewController *viewController = [[UIViewController alloc] init];
    viewController.view.backgroundColor = [UIColor whiteColor];

    [self.navigationController pushViewController:viewController animated:YES];
}
我发现很难相信我在iOS11和ios12中遇到了一个迄今未被注意到的bug(在10中没有出现),但如果在某种程度上是我的错,我真的不知道我在这里会做错什么


以前有人看到过这一点,或者有人建议我这里缺少什么?

我的猜测是,在转换到不同大小时,推送是一种竞争条件。当转换到新大小完成时,updateConstraints/needsLayout标志可能为否(也就是说,它已经认为它已经完全完成了它的视图,在推送完成之后,但是旋转还没有完成)。我会认为这是一个苹果bug,如果你还没有的话,我会报告它。

作为一种解决方法,您可以使用UINavigationController的子类实现
viewwilltransitionsize:withTransitionCoordinator:
,然后如果需要,抛出一个额外的
[self.view setNeedsLayout]
[self.view setNeedsUpdateConstraints]
coordinator AnimateLongsideTransition:completion:的完成块中

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {
    [coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext>  _Nonnull context) {
    } completion:^(id<UIViewControllerTransitionCoordinatorContext>  _Nonnull context) {
        UIView *topView = [self.topViewController view];
        // we should only need an additional layout if the topView's size doesn't match the size
        // we're transitioning to (otherwise it should have already beend layed out properly)
        BOOL needsAdditionalLayout = topView && CGSizeEqualToSize(topView.frame.size, size) == NO;
        if (needsAdditionalLayout) {
            // either of these two should do the trick
            [self.view setNeedsUpdateConstraints];
            // [self.view setNeedsLayout];
        }
    }];
}
-(void)视图将转换大小:(CGSize)带有转换协调器的大小:(id)协调器{
[coordinator AnimateLongsideTransition:^(id_非空上下文){
}完成:^(id_非空上下文){
UIView*topView=[self.topViewController视图];
//如果topView的大小不匹配,我们应该只需要一个额外的布局
//我们正在过渡到(否则它应该已经被适当地布置好了)
BOOL needsAdditionalLayout=topView&&CGSizeEqualToSize(topView.frame.size,size)==NO;
如果(需要,请参阅附件){
//这两个人中的任何一个都应该起作用
[self.view setNeedsUpdateConstraints];
//[self.view setNeedsLayout];
}
}];
}

这似乎可以在完成大小转换后正确调整视图的大小。

很好的解决方案-效果很好!非常感谢您的帮助,感谢您验证我没有遗漏任何明显的错误。我也向苹果提交了一份错误报告:)很高兴看到我不是唯一一个经历过这种情况的人!苹果有没有对错误报告做出过回应?没有-什么都没有。我只是检查了一下,一年多后,错误报告仍然没有公布:/