故事板 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];
}
我有一个应用程序,我使用 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];
}