故事板 ViewController UI 故障

Storyboard ViewController UI Glitch

我有一个应用程序,我使用 Storyboard 和自动版式进行布局。我使用 UINavigationViewController 以编程方式在按下按钮时在 UIViewController 之间进行转换。我使用 XCode 6,最小 iOS 版本号为 7.1(在 iPhone 4s 上测试)。

我想编写一个可以缩放到所有屏幕尺寸(iPhone、iPad 等)的通用界面。为此,我使用了根据屏幕尺寸按比例定义的 UIView 来分隔视图(请参见图 1):


图 1 - 测试应用程序主页的屏幕截图

在图 1 中,如上所示,红色方块是根据屏幕尺寸按比例定义的 UIView,用于 "space out" "real" 视图(蓝色和灰色的视图)。

不幸的是,我开始注意到当用户在 UIViewController 之间转换时,视图控制器中的视图会在转换后 "resize"(视图会移动几个像素或调整几个像素的大小)。在用户转换到适当的屏幕后,整个界面会发生轻微变化,这会产生相当烦人的体验。

我将项目剔除到产生这种调整大小效果所需的合理最少代码,希望有人能帮助我(因为我不知所措)。

第一个视图控制器的故事板视图层次结构:

第一个视图控制器的约束:

第二个视图控制器的设置:

用于从第一个控制器转换到第二个控制器(推送)的代码:

- (IBAction)transitionForward:(UIButton *)sender
{
    UIViewController *controller = [self.navigationController.storyboard instantiateViewControllerWithIdentifier:@"BackController"];
    [self.navigationController pushViewController:controller animated:YES];
}

用于从第二个控制器弹出到第一个控制器的代码:

- (IBAction)transitionBack:(UIButton *)sender
{
    [self.navigationController popViewControllerAnimated:YES];
}

如前所述,问题是在用户单击按钮触发 push/pop 后,视图控制器加载后,界面似乎会稍微调整 itself/move 大小。这种效果相当刺耳,我非常感谢有关如何阻止它的任何建议。

可在 Github.

找到演示该问题的简化项目

如果还有什么我可以提供的,请尽管问。感谢您的时间和帮助。


编辑: 经过进一步调查,似乎视图控制器的 viewDidLayoutSubviews 方法在视图控制器转换时被调用了两次(以防帮助任何人诊断问题)。

尝试用这段代码替换你的 push 和 pop 函数,然后 leme 知道你的要求是否满足。

- (IBAction)transitionBack:(UIButton *)sender
{
    CATransition *transition = [CATransition animation];
    transition.duration = 0.45;
    transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionDefault];
    transition.type = kCATransitionFromLeft;
    [transition setType:kCATransitionPush];
    transition.subtype = kCATransitionFromLeft;
    transition.delegate = self;
    [self.navigationController.view.layer addAnimation:transition forKey:nil];


    [self.navigationController popViewControllerAnimated:NO];
}

- (IBAction)transitionForward:(UIButton *)sender
{

    UIViewController *controller = [self.navigationController.storyboard instantiateViewControllerWithIdentifier:@"BackController"];
    CATransition *transition = [CATransition animation];
    transition.duration = 0.45;
    transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionDefault];
    transition.type = kCATransitionFromRight;
    [transition setType:kCATransitionPush];
    transition.subtype = kCATransitionFromRight;
    transition.delegate = self;
    [self.navigationController.view.layer addAnimation:transition forKey:nil];


    [self.navigationController pushViewController:controller animated:NO];
}