在 UINavigationController 中添加带有标题的图像

Posted

技术标签:

【中文标题】在 UINavigationController 中添加带有标题的图像【英文标题】:Adding an Image with a Title in a UINavigationController 【发布时间】:2016-10-19 15:30:57 【问题描述】:

我想在 UINavigationController 的标题旁边显示一个小图标。

通过 Photoshop 的魔力,像这样:

我知道我需要创建一个新视图并将图像和标题构建到其中。这是我正在做的事情:

在UINavigationController视图控制器的viewDidLoad中,我调用了方法

[self setTitleBar];

调用此方法:

- (void) setTitleBar 


    CGRect navBarFrame = self.navigationController.navigationBar.frame;


    //UIView *titleView = [[UIView alloc] initWithFrame:CGRectMake(navBarFrame.origin.x, navBarFrame.origin.y, (leftButtonFrame.origin.x + leftButtonFrame.size.width) - rightButtonFrame.origin.x, navBarFrame.size.height)];
    UIView *titleView = [[UIView alloc] initWithFrame:CGRectMake(navBarFrame.origin.x, navBarFrame.origin.y,self.view.frame.size.width,navBarFrame.size.height)];
    titleView.backgroundColor = [UIColor clearColor];


    CGPoint tvCenter = CGPointMake(titleView.frame.size.width/2, titleView.frame.size.height/2);

    UIImage * icon = [UIImage imageNamed:@"star"];

    UIImageView *iconView = [[UIImageView alloc] initWithImage:icon];
    iconView.frame = CGRectMake(0, 0, icon.size.width, icon.size.height);

    UILabel *title = [[UILabel alloc] init];
    title.backgroundColor = [UIColor clearColor];
    title.textColor = [UIColor whiteColor];
    title.textAlignment = NSTextAlignmentCenter;
    title.text = @"SOME TITLE";
    title.frame = CGRectMake(0, 0, 100, titleView.frame.size.height);
    [title sizeToFit];


    iconView.center = CGPointMake(tvCenter.x - (icon.size.width/2), tvCenter.y);

    [titleView addSubview:iconView];
    [titleView addSubview:title];

    self.navigationItem.titleView = titleView;

我在titleView中的逻辑是:获取最左边的按钮框架,获取最右边的按钮框架。然后做一些数学计算来计算视图的大小。那应该是titleView的frame size。

但是,我似乎无法让它工作。如果我插入的帧大小为 0,0,100,40;然后它显示框架,但所有内容都被挤压在一起。但是你看到了。我知道 100 应该是动态的以确保显示标题。

但我似乎无法弄清楚。

有什么帮助吗?

【问题讨论】:

使用sizeToFit。这是文档developer.apple.com/reference/uikit/uiview/…。 导航栏会自动调整视图大小吗?如果是这样,也许你应该在 XIB 中制作它,以便在调整大小时可以轻松查看它的外观。 【参考方案1】:

您可以将对象作为子视图放置在导航控制器视图上。

- (void) setTitleBar 

    //Let's say your icon size is 20
    int starSize = 20;
    //Now you'll have to calculate where to place the ImageView respect the TextSize (for this you'll need to know the text and font of your UINavigationItem title)
    CGSize textSize = [@"SOME TITLE" sizeWithAttributes:@NSFontAttributeName:[UIFont fontWithName:@"navfontname" size:15]];
    UIImageView *startImageView = [[UIImageView alloc] initWithFrame:CGRectMake(self.navigationController.view.frame.size.width/2 - textSize.width/2, self.navigationController.view.frame.size.height/2 - starSize/2, starSize,starSize)];
    startImageView.image = [UIImage imageNamed:@"star"];
    [self.navigationController.view addSubview:startImageView];


【讨论】:

嗯.. 我似乎无法让它工作。虽然看起来合乎逻辑 是作为子视图添加到 self.navigationController.view 的 UIImageView 吗?如果将其框架设置为 CGRectMake(0,0,20,20) 之类的东西,你能看到它吗? 它将它放在屏幕中间。

以上是关于在 UINavigationController 中添加带有标题的图像的主要内容,如果未能解决你的问题,请参考以下文章

在 UINavigationController 内的 UITabBarcontroller 中添加 UINavigationController?

从嵌入在 UINavigationController 中的一个视图控制器到另一个 UINavigationController

(Swift) 在嵌套在 Main UINavigationController 中的 UINavigationController 和 UITabController 之间切换

关闭 UINavigationController 并呈现另一个 UINavigationController

带有主 UINavigationController 和详细 UINavigationController 的 UISplitViewcontroller

UINavigationController 标题和按钮