9

有几个类似的问题没有得到答案,但描述模糊。我已将问题简化为一个非常薄的应用程序,并添加了详细的屏幕截图。我非常感谢这个解决方案!

唯一涉及的代码是添加到根 VC 的viewDidLoad 的一行。此行的目的是使导航控制器不透明:

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.navigationController.navigationBar.translucent = NO;
}

这个问题的一个关键信息是 'Title1'在其导航项中有提示,而 'Title2' 没有提示

我有一个带有一个导航控制器的故事板,一个名为“Title1”的根 VC,有一个 segue 按钮,它可以连接到另一个名为“Title2”的 VC

故事板


在此处按下按钮时:

印前


我得到了这个奇怪的屏幕:

按后


当按回(Title1)时,情况变得更糟(即:Title1的原始标签被推高,现在再也看不到了!!!):

回来后

请问有人吗??

4

5 回答 5

3

它显示为 UINavigationBar 的半透明属性似乎与其他视图控制器的框架混淆了。

我会推荐以下方法。

创建一个基本视图控制器,其他视图控制器将从该控制器继承,如下所示,

#import "BaseViewController.h"

@interface BaseViewController ()

@end

@implementation BaseViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.navigationController.navigationBar.translucent = NO;
}

其他视图控制器将继承上述 BaseViewController

// 界面

#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 继承。

于 2014-01-12T13:38:51.433 回答
3

迟到的答案,但我今天偶然发现了这个问题,发现了你的问题,但它还没有被接受的答案。

从提示的 viewController 转到情节提要中的非提示 viewController 时出现此错误。

我和你一样有那个黑条。

并修复:

// In prompted vc
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    UIView.setAnimationsEnabled(false)
    self.navigationItem.prompt = nil
    UIView.setAnimationsEnabled(true)
}

这将在切换视图控制器之前立即删除提示。

更新

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()
    }
}
于 2015-05-28T11:13:35.020 回答
3

解决此问题的最佳方法是在推送期间设置窗口的背景,即,

let appdelegate = UIApplication.shared.delegate as! AppDelegate
appdelegate.window?.backgroundColor = UIColor.white
于 2018-02-27T10:07:19.453 回答
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" iPhone 框架尺寸)。您必须计算这个尺寸,否则您可能会遇到更大屏幕的问题。

于 2014-01-12T12:39:26.850 回答
0

该线程上的最佳答案刚刚为我解决了这个问题,谢谢。

事情是这样的,我正在开发的应用程序使用协调器和自动布局,所以看这表明动画需要关闭。我不得不将导航控制器的推送视图控制器功能的动画参数更改为 false。

前任:

navigationController?.pushViewController(view, animated: false)
于 2020-06-08T15:37:19.400 回答