【问题标题】:iOS: Add UIView below UINavigationBariOS:在 UINavigationBar 下方添加 UIView
【发布时间】:2014-01-02 15:26:46
【问题描述】:

如果我尝试使用以下代码向自定义 UINavigationController 中的导航栏添加视图:

- (void)viewDidLoad {

        [super viewDidLoad];
        self.sv = (MyCustomView *)[[[NSBundle mainBundle]loadNibNamed:@"MyCustomView" owner:self options:nil] objectAtIndex:0];
        self.sv.frame = CGRectMake(self.navigationBar.frame.origin.x, self.navigationBar.frame.size.height, self.navigationBar.frame.size.width, heightOfMyCustomView);
        [self.navigationBar addSubview:self.sv];
    }

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    [super pushViewController:viewController animated:animated];
    viewController.view.frame = CGRectMake(viewController.view.frame.origin.x, viewController.view.frame.origin.y + heightOfMyCustomView, viewController.view.frame.size.width, viewController.view.frame.size.height - heightOfMyCustomView);
}

当我推动控制器时,控制器视图的顶部被我添加到导航栏的自定义视图隐藏。 如何将控制器的视图放在自定义视图下方?

【问题讨论】:

  • 你可能会有更好的运气继承 UINavigationBar 并使用 initWithNavigationBarClass:toolbarClass: 初始化你的导航控制器。

标签: ios objective-c uinavigationcontroller uinavigationbar


【解决方案1】:

我还建议查看 UINavigationItem.titleView 属性,它使您能够为导航栏标题区域提供视图。

【讨论】:

  • 无法定位到UINavigationBar 下方查看,因为titleView 将在导航栏内居中。这仍然很有用,所以我会在评论部分添加这些信息,但不作为答案。
  • 这将适用于添加自定义视图 inside 导航栏,这是问题所问的,但是问题的标题是关于添加视图 below 导航栏。 OP 应该澄清他的实际目的。
【解决方案2】:

在您的自定义 UINavigationController 初始化方法中,将委托分配给自身,如下所示:

CustomeNavCtrl.m 文件:

@implementation CustomeNavCtrl

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        self.delegate = self;
    }
    return self;
}

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated{
    //Todo:viewController.view layout
    //Todo:send MyCustomView to back or something other you like.
}

CustomeNavCtrl.h 文件:

 @interface CustomeNavCtrl : UINavigationController<UINavigationControllerDelegate> {

 }

【讨论】:

  • 我解决了在 navigationController:didShowViewController:animated: 视图控制器视图的框架中的设置。非常感谢您让我走上正确的道路!
  • 我不认为继承和覆盖UINavigationController 函数是一个好主意,它已经是一个复杂的控制器,所以你可能会添加不必要的复杂性并引入错误。具有组合的架构通常比继承更受欢迎!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-03
  • 2013-09-18
  • 2014-03-20
相关资源
最近更新 更多