2012-03-29 118 views
16

我有一个自定义的UINavigationBar标题和一个自定义后退按钮。 我的问题是,标题不在iPhone上居中。 就好像我的后退按钮正在将标题推向右侧。任何想法如何我可以集中它?UINavigationBar中的中心自定义标题?

int height = self.navigationController.navigationBar.frame.size.height; 
int width = self.navigationController.navigationBar.frame.size.width; 


UILabel *navLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, width + 300, 20)]; 
navLabel.backgroundColor = [UIColor whiteColor]; 
navLabel.textColor = [UIColor redColor]; 
navLabel.font = [UIFont fontWithName:@"Helvetica" size:30]; 
navLabel.textAlignment = UITextAlignmentCenter; 
self.navigationItem.titleView = navLabel; 
[navLabel release]; 
((UILabel *)self.navigationItem.titleView).text = self.title; 

谢谢!

编辑我删除多余的代码,增加了这样的画面:

Picture of title off ceter

注意标题是如何被推到容纳按钮....

+0

似乎是一个差异问题。我的标题正确地垂直居中。它没有正确的水平居中(按钮移动它)。如果我删除按钮一切都完美居中...... – itgiawa 2012-03-29 19:27:48

回答

40

的iOS是因为这样做你初始化的帧总是300 +宽像素。它试图将整个框架居中,框架比想要适合它的空间大(因为按钮),因此标签被推向右边。 你需要做的是给navLabel的框架所需的最小尺寸。

因此,如果您的文字只有100px宽,但框架是400px,那么iOS会尝试将导航标题中的400px居中,并且没有足够的空间。当您将尺寸设置为实际需要的100像素时,iOS会正确居中您的标题,因为有足够的空间来居中显示100像素。

下面的代码段应该可以帮助您检测帧的最小尺寸,具体取决于您尝试放入的字体和文本。 确保标签的框架尽可能小,但不会超过最大宽度。 (导航栏的宽度)。

UIFont* titleFont = [UIFont fontWithName:@"Helvetica" size:30]; 
CGSize requestedTitleSize = [titleText sizeWithAttributes:@{NSFontAttributeName: titleFont}]; 
CGFloat titleWidth = MIN(maxTitleWidth, requestedTitleSize.width); 

UILabel *navLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, titleWidth, 20)]; 
navLabel.backgroundColor = [UIColor whiteColor]; 
navLabel.textColor = [UIColor redColor]; 
navLabel.font = [UIFont fontWithName:@"Helvetica" size:30]; 
navLabel.textAlignment = NSTextAlignmentCenter; 
navLabel.text = titleText; 
self.navigationItem.titleView = navLabel; 
+1

iOS 6及以上版本中的注意事项UITextAlignmentCenter已被弃用。您可以改用NSTextAlignmentCenter。 – user885232 2014-08-31 19:35:34

+0

谢谢,我在回复中更新了这个 – Bocaxica 2014-09-01 14:13:39

+0

self.navigationItem.titleView - 完美! – gbk 2014-09-26 14:09:47

3

不错的答案!但是,现在不推荐使用sizeWithFont。你现在想要做这样的事情。

NSDictionary *textTitleOptions = [NSDictionary dictionaryWithObjectsAndKeys: [UIFont fontWithName:@"Helvetica" size:30], NSFontAttributeName, nil]; 

CGSize requestedTitleSize = [[NSString stringWithFormat:@"Your String"] sizeWithAttributes:textTitleOptions]; 

CGFloat titleWidth = MIN(self.view.frame.size.width, requestedTitleSize.width); 

UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, titleWidth, 44)]; 
5

我以前有同样的问题。我有一个UINavigationbar右键和左键。 我想在UINavigationbar上对图像进行居中。所以我不得不把图像放入一个UIViewwidth 0. 图像自己得到一个x值是自己的一半width

UINavigationItem *item = navigationController.topViewController.navigationItem; 
UIView *backView =[[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 30)]; 
[img_logo setFrame:CGRectMake(-45, 5, 90, 20)]; 
[backView addSubview:img_logo]; 
item.titleView = backView; 
+0

惊讶这个作品,但它对我很好。知道能够在零宽度视图内“隐藏”视图的有趣技巧。 – anorskdev 2017-05-22 22:47:24

2

我用自动布局约束来解决这个问题:

  1. 添加的UILabel到一个UIView。的centerX为的UILabel
  2. 集约束:

    self.titleLabelCenterXConstraint = [NSLayoutConstraint constraintWithItem:self.titleLabel attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeCenterX multiplier:1.0f constant:0.0f];

  3. 在UIView的layoutSubViews调整的centerX偏移值:

    - (void)layoutSubviews { [super layoutSubviews]; CGFloat screenCenter = CGRectGetMidX([UIScreen mainScreen].bounds); CGFloat diffCenter = screenCenter - CGRectGetMidX(self.frame); self.titleLabelCenterXConstraint.constant = diffCenter; }

  4. 组的UIView到navigationItem titleview的

+0

试过了。没有工作。标题没有动。正如计算的那样,偏移是正确的。 – osxdirk 2016-09-06 13:14:20

+0

你能分享你的代码吗? – 2016-09-09 00:27:45

+1

工程就像一个魅力! – odm 2017-03-24 18:34:03

1

SWIFT 2.3:

let tlabel = UILabel(frame: CGRectMake(0, 0, 200, 40)) 
    tlabel.text = self.title 
    tlabel.textColor = UIColor.whiteColor() 
    tlabel.font = UIFont.boldSystemFontOfSize(17) //UIFont(name: "Helvetica", size: 17.0) 
    tlabel.backgroundColor = UIColor.clearColor() 
    tlabel.adjustsFontSizeToFitWidth = true 
    tlabel.textAlignment = .Center 
    self.navigationItem.titleView = tlabel 
0

标题未在导航栏本身居中。它位于导航栏的左侧按钮和右侧按钮之间。这意味着如果左侧有一个大按钮,则标题将向右移动。

您可以通过添加一个居中的约束你的标题,然后修改它改变中心所以真的导航栏的中心:对@ BHuelse的回答

// Position the title in the middle of the navbar and not in the middle of buttons 
fileprivate func centerTitle() { 
    if let navigation = self.navigationController { 
     let titleMiddle = navigation.navigationBar.convert(titleViewLabel.frame, from: titleViewLabel.superview).midX 
     let diff = navigation.navigationBar.center.x - titleMiddle 
     constraintTitleViewCentered.constant += diff 
    } 
} 
1

斯威夫特3:

let image = UIImage(named: "logo") 
let logoView = UIView.init(frame: CGRect(x: 0, y: 0, width: 0, height: 30)) 
let imageView = UIImageView(frame: CGRect(x: -45, y: 5, width: 90, height: 20)) 
imageView.image = image 
imageView.contentMode = .scaleAspectFit 
logoView.addSubview(imageView) 
self.navigationItem.titleView = logoView