在导航控制器中添加子视图覆盖导航栏

Posted

技术标签:

【中文标题】在导航控制器中添加子视图覆盖导航栏【英文标题】:Adding Subview Covers Up Navigation Bar in Navigation Controller 【发布时间】:2014-08-07 15:20:54 【问题描述】:

我有一个导航控制器,有时我需要显示一个子视图来输入密码。问题是,当我这样做时,它会覆盖导航栏,从而无法返回层次结构。我为此使用 XIB,但它没有让我选择调整添加在其上的 UIView 的大小。

if ([student isEqualToString:@"No"]) 
    [self.navigationController.view addSubview:password];
    [self.navigationController.view bringSubviewToFront:password];

【问题讨论】:

【参考方案1】:

这里有一些建议(假设我了解您的问题)。鉴于您正在提示输入密码,我假设您希望用户 a) 提供密码或 b) 取消输入密码(而不是简单地忽略它)。如果他们执行后者,则可以使用取消按钮来关闭密码子视图。

建议:

    在子视图中添加取消按钮以关闭子视图

    使用 UIAlertView 显示一个模式对话框,通过取消按钮捕获密码(见下文)

    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Password" message:@"Enter your password:" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Ok", nil]; alertView.alertViewStyle = UIAlertViewStyleLoginAndPasswordInput; // 屏蔽密码文本

    如果您已设置当前方法,则定义类似于以下内容的子视图,使其偏离导航栏(或使用约束)

    UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 200, tableView.frame.size.width, 100)];

【讨论】:

【参考方案2】:

如果您能提供所见内容的屏幕截图和您尝试构建的界面设计的图像,将会很有帮助。

上面的代码看起来有点奇怪。使用addSubview: 将这种类型的视图添加到您的navigationController 可能会产生意想不到的后果。

我会推荐:

    在新的 UIViewController 子类中构建您的密码输入 UI,并使用 pushViewController:animated: 将此新的 viewController 添加到视图层次结构中。

    通过使用系统UIAlertView 或使用UIWindow 构建自定义警报视图,使用alertView 捕获密码条目。

如果您需要进一步解释/澄清,请告诉我。

【讨论】:

以上是关于在导航控制器中添加子视图覆盖导航栏的主要内容,如果未能解决你的问题,请参考以下文章

添加子视图会在子视图和导航栏之间留下空隙

在 Swift 中使 NavigationBar 子视图可点击

如何使用 swift 在子视图中添加标签栏和导航栏?

如何在不丢失导航栏的情况下将子视图添加到 UINavigation 控制器?

推送视图控制器中的半透明导航栏覆盖?

UIViewController 导航 - 在意外状态下完成导航转换。导航栏子视图树可能会损坏