2012-03-29 35 views
16

Tôi có một tiêu đề UINavigationBar tùy chỉnh và một nút quay lại tùy chỉnh. Vấn đề của tôi là tiêu đề không tập trung vào iPhone. Giống như nút quay lại của tôi đang đẩy tiêu đề sang bên phải. Bất kỳ ý tưởng làm thế nào tôi có thể trung tâm nó?tiêu đề tùy chỉnh của trung tâm trong 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; 

Cảm ơn!

chỉnh sửa Tôi không xoá mã thừa và bổ sung hình ảnh này:

Picture of title off ceter

Chú ý cách tiêu đề được đẩy lên để chứa các nút ....

+0

Có vẻ là một vấn đề khác. Tiêu đề của tôi được căn giữa theo chiều dọc. Nó không nằm ở chính giữa theo chiều ngang (nút di chuyển nó lên trên). Nếu tôi xóa nút, mọi thứ đều được căn giữa một cách hoàn hảo ... – itgiawa

Trả lời

40

iOS được làm điều này vì các khung bạn khởi tạo là hơn 300 pixel chiều rộng. Nó đang cố gắng để trung tâm khung hình đầy đủ, khung hình lớn hơn không gian nó muốn phù hợp với nó (vì nút) và do đó nhãn của bạn bị đẩy sang phải. Những gì bạn cần làm là cung cấp cho Frame của navLabel kích thước tối thiểu cần thiết.

Vì vậy, nếu văn bản của bạn chỉ rộng 100px, nhưng khung là 400px, thì iOS đang cố gắng căn giữa 400px bên trong tiêu đề Điều hướng và không có đủ dung lượng. Khi bạn đặt kích thước cho 100px thực sự cần thiết, iOS sẽ căn giữa tiêu đề của bạn một cách chính xác, bởi vì có rất nhiều không gian để căn giữa 100px.

Đoạn mã dưới đây sẽ giúp bạn phát hiện kích thước tối thiểu mà khung của bạn cần, tùy thuộc vào phông chữ và văn bản bạn cố gắng đặt. Đảm bảo khung của nhãn càng nhỏ càng tốt, nhưng không vượt quá chiều rộng tối đa. (chiều rộng của thanh điều hướng).

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

Lưu ý trong iOS 6 trở lên UITextAlignmentCenter đã không được chấp nhận. Thay vào đó, bạn có thể sử dụng NSTextAlignmentCenter. – user885232

+0

Cảm ơn bạn, tôi đã cập nhật điều này trong câu trả lời – Bocaxica

+0

self.navigationItem.titleView - hoàn hảo! – gbk

3

Câu trả lời hay! Tuy nhiên sizeWithFont hiện không được chấp nhận. Bạn sẽ muốn làm một cái gì đó như thế này ngay bây giờ.

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

Tôi đã gặp vấn đề tương tự trước đây. Tôi đã có một UINavigationbar với nút phải và trái. Tôi muốn căn giữa hình ảnh trên UINavigationbar. Vì vậy, tôi đã phải đưa hình ảnh vào một số UIView với width 0. Hình ảnh tự nhận được giá trị x bằng một nửa số của riêng mình 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

Ngạc nhiên tác phẩm này, nhưng nó hoạt động tốt cho tôi. Bí quyết thú vị để biết để có thể "ẩn" một chế độ xem bên trong chế độ xem chiều rộng bằng không. – anorskdev

2

tôi đã sử dụng hạn chế autolayout để giải quyết vấn đề này:

  1. Thêm UILabel vào một UIView.
  2. Set hạn chế của centerX cho UILabel:

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

  3. Trong UIView layoutSubviews để điều chỉnh centerX bù đắp giá trị:

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

  4. bộ UIView để navigationItem titleView

+0

Đã thử điều đó. Đã không hoạt động.Tiêu đề không di chuyển. Bù đắp được tính toán chính xác, như nó có vẻ. – osxdirk

+0

bạn có thể chia sẻ mã không? –

+1

Làm việc như một sự quyến rũ! – odm

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

Tiêu đề không nằm trong chính thanh điều hướng. Nó nằm giữa các nút bên trái và các nút bên phải của thanh điều hướng. Điều này có nghĩa là nếu bạn có một nút lớn ở bên trái, tiêu đề sẽ được dịch sang phải.

Bạn có thể thay đổi trung tâm bằng cách thêm một hạn chế làm trung tâm để tiêu đề của bạn và sau đó thay đổi nó để nó thực sự là trung tâm của navbar:

// 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

Swift 3 cho câu trả lời @ BHuelse của:

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 
Các vấn đề liên quan