有几个类似的问题没有得到答案,但含糊地描述。我已将问题缩减为非常薄的应用程序,并添加了详细的屏幕截图。我非常感谢这个解决方案!
唯一涉及的代码是一行添加到根VC的viewDidLoad 。此行的目的是使导航控制器不透明:
- (void)viewDidLoad
{
[super viewDidLoad];
self.navigationController.navigationBar.translucent = NO;
}
此问题的一个重要信息是'Title1'在其导航项中有一个提示,,而'Title2'没有提示。
我有一个带有一个导航控制器的故事板,一个名为“Title1”的根VC,带有一个带有第二个名为“Title2”的VC的segue按钮
按此处按钮时:
我得到了这个奇怪的画面:
当按下(Title1)时,它变得更糟(即:Title1的原始标签被推高,现在不再被看见了!!!):
有人请吗?
答案 0 :(得分:3)
看起来UINavigationBar的半透明属性似乎与框架其他视图控制器混乱。
我建议采用以下方法。
创建一个基本视图控制器,其他视图控制器将从该控制器继承如下,
#import "BaseViewController.h"
@interface BaseViewController ()
@end
@implementation BaseViewController
- (void)viewDidLoad
{
[super viewDidLoad];
self.navigationController.navigationBar.translucent = NO;
}
其他视图控制器将继承上面的BaseViewController
// interface
#import <UIKit/UIKit.h>
#import "BaseViewController.h"
@interface ViewController : BaseViewController
@end
//实施
#import "ViewController.h"
@implementation ViewController
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
// Here translucent property is enabled when the view is about to be disappeared.
// However note that, translucent property needs to be enabled only on those view controllers which has prompt set on their navigation items.
self.navigationController.navigationBar.translucent = YES;
}
没有提示实现的其他视图控制器将照常工作,但它们也需要从BaseViewController继承。
答案 1 :(得分:2)
迟到的答案,但我今天偶然发现了这个问题并找到了你的问题而且还没有接受答案。
从提示的viewController转到storyboard中未提示的viewController时出现此错误。
我和你一样得到了那个黑条。
并修复:
// In prompted vc
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
UIView.setAnimationsEnabled(false)
self.navigationItem.prompt = nil
UIView.setAnimationsEnabled(true)
}
这将在切换viewcontroller之前立即删除提示。
func prompt() -> String? {
return nil
}
override func viewWillAppear(animated: Bool) {
let action = { self.navigationItem.prompt = self.prompt() }
if self.navigationController?.viewControllers.count <= 1 {
UIView.performWithoutAnimation(action)
}
else {
action()
}
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
UIView.performWithoutAnimation {
self.navigationItem.prompt = (segue.destinationViewController as? ViewController)?.prompt()
}
}
答案 2 :(得分:1)
似乎Xcode在更改navigationBar高度时遇到了一些问题,因为主控制器视图没有相应调整大小。
我找到了一个解决方案来做到这一点,不确定它是最好的......但是它正在发挥作用。
只需继承第一个视图控制器中的viewWillAppear
和viewWillDisappear
方法(带提示的方法):
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
self.navigationItem.prompt = @"Prompt1";
[UIView animateWithDuration:UINavigationControllerHideShowBarDuration
delay:0.0
options: UIViewAnimationOptionCurveEaseOut
animations:^{
[self.view setFrame:CGRectMake(0, 94, 320, 386)];
}
completion:^(BOOL finished){
}];
}
- (void) viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
// Sets prompt to nil
self.navigationItem.prompt = nil;
[UIView animateWithDuration:UINavigationControllerHideShowBarDuration
delay:0.0
options: UIViewAnimationOptionCurveEaseOut
animations:^{
[self.view setFrame:CGRectMake(0, 64, 320, 416)];
}
completion:^(BOOL finished){
}];
}
我没有专注于帧尺寸(它适用于3,5和#34; iPhone的帧尺寸)。您必须计算此尺寸,否则您可能会遇到更大屏幕的问题。
答案 3 :(得分:1)
解决此问题的最佳方法是在推动期间设置窗口的背景,即
{{1}}
答案 4 :(得分:0)
此线程的最高答案刚刚为我解决了这个问题,谢谢。
这就是问题,我正在开发的应用程序使用了协调器和自动布局,因此查看此动画需要关闭动画。我必须将导航控制器的推式视图控制器功能的animate参数更改为false。
例如:
navigationController?.pushViewController(view, animated: false)