2012-03-29 114 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 
相關問題