2010-06-26 9 views
14

Tôi đang sử dụng thuộc tính titleView của UINavigationItem để đặt UILabel tùy chỉnh với kích thước phông chữ/màu mong muốn của tôi. Đây là mã của tôi:Tiêu đề UINavigationItemXem vị trí

self.headerLabel = [[UILabel alloc] initWithFrame:CGRectMake(0.0, 0.0, 400.0, 44.0)]; 
self.headerLabel.textAlignment = UITextAlignmentCenter; 
self.headerLabel.backgroundColor = [UIColor clearColor]; 
self.headerLabel.font = [UIFont boldSystemFontOfSize:20.0]; 
self.headerLabel.textColor = [UIColor colorWithRed:0.259 green:0.280 blue:0.312 alpha:1.0]; 
self.navigationItem.titleView = self.headerLabel; 

Trong thanh điều hướng, tôi cũng có nút thanh bên trái. Kết quả là thế này:

alt text http://cl.ly/41164eec656c96e7c913/content

Như bạn thấy, các văn bản không được làm trung tâm đúng cách. Tôi đã thử thiết lập x nguồn gốc của nhãn, nhưng điều này không có hiệu lực.

+0

Tôi không thấy hình ảnh ... – turingtested

Trả lời

15

Nếu bạn đặt tiêu đềLabel là chế độ xem phụ của titleView, bạn có thể đặt khung tiêu đề của nhãn để kiểm soát vị trí của nó trong tiêu đềXem.

Cách bạn đang thực hiện ngay bây giờ, bạn không có quyền kiểm soát đó. Tôi nghĩ rằng hệ điều hành chọn khung của titleView cho bạn dựa trên không gian có sẵn.

Hy vọng điều này sẽ hữu ích!

+0

Xin chào, tôi đã thử điều này nhưng tiêu đềView của tôi đang bị đẩy xuống một chút khi tôi có nút ở bên trái hoặc bên phải. Bạn có thể ngăn điều này xảy ra không? – quantumpotato

+0

Tiêu đề của tôi thậm chí không được hiển thị khi làm điều này ... – sebrock

+0

Điều này cũng không có tác dụng đối với tôi, tôi đang làm gì sai ở đây? HeaderLabel không xuất hiện ở tất cả khi tôi [self.navigationItem.titleView addSubview: headerLabel] ;. Tôi có cần đặt tiêu đềView thành thứ gì đó đầu tiên không? –

1

Chỉ cần tính toán kích thước khung hình chính xác cần thiết và sắp xếp sang trái:

UIFont* font = [UIFont fontWithName:@"Bitsumishi" size:20]; 
CGSize maximumLabelSize = CGSizeMake(296,9999); 
CGSize expectedLabelSize = [title sizeWithFont:font constrainedToSize:maximumLabelSize lineBreakMode:UILineBreakModeCharacterWrap]; 
CGRect frame = CGRectMake(0, 0, expectedLabelSize.width, expectedLabelSize.height); 
UILabel *label = [[[UILabel alloc] initWithFrame:frame] autorelease]; 
label.font = font; 
label.textAlignment = UITextAlignmentLeft; 
label.text = title; 
self.titleView = label; 
0
UIView *vw = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 40)]; 
UILabel *lbl = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 320, 40)]; 
lbl.text = @"Home"; 
lbl.textAlignment = UITextAlignmentCenter; 
lbl.backgroundColor = [UIColor clearColor]; 
lbl.textColor = [UIColor whiteColor]; 
lbl.font = [UIFont fontWithName:@"HelveticaNeue-Bold" size:20]; 
lbl.shadowColor = [UIColor blackColor]; 
lbl.shadowOffset = CGSizeMake(0,1); 
self.navigationItem.titleView = vw; 
[self.navigationItem.titleView addSubview:lbl]; 
19

Thay vì initWithFrame chỉ cần sử dụng init và đưa [self.headerLabel sizeToFit]sau dòng cuối cùng của bạn mã.

+2

Điều này hoạt động như một say mê. Không ai nên bỏ phiếu này xuống. –

+0

Tôi đã không bỏ phiếu, nhưng tôi có thể thấy ai đó có thể tranh luận rằng nó không trả lời câu hỏi được hỏi, nhưng cung cấp một thủ thuật tiếp tuyến hữu ích. – Olie

3

Tôi đã sử dụng nhãn tiêu đề tùy chỉnh cho thanh điều hướng của tôi trong mọi ứng dụng tôi có trong cửa hàng ứng dụng. Tôi đã thử nghiệm nhiều cách khác nhau để làm như vậy và bằng cách xa cách dễ nhất để sử dụng nhãn tùy chỉnh trong thanh điều hướng là bỏ qua hoàn toàn titleView và chèn nhãn của bạn trực tiếp vào navigationController.view.

Với cách tiếp cận này, thật dễ dàng để khung của nhãn tiêu đề luôn khớp với khung của navigationBar - ngay cả khi bạn đang sử dụng navBar tùy chỉnh có kích thước không chuẩn.

- (void)viewDidLoad { 
    [self.navigationController.view addSubview:self.titleLabel]; 
    [super viewDidLoad]; 
} 

- (BOOL)shouldAutorotateToInterfaceOrientation: 
      (UIInterfaceOrientation)interfaceOrientation { 
    return YES; 
} 

- (void)didRotateFromInterfaceOrientation: 
      (UIInterfaceOrientation)fromInterfaceOrientation { 
    [self frameTitleLabel]; 
} 

- (UILabel *) titleLabel { 
    if (!titleLabel) { 
     titleLabel = [[UILabel alloc]   
      initWithFrame:self.navigationController.navigationBar.frame]; 

     titleLabel.font = [UIFont fontWithName:@"Helvetica-Bold" size:18]; 
     titleLabel.text = NSLocalizedString(@"Custom Title", nil); 
     titleLabel.textAlignment = UITextAlignmentCenter; 
     titleLabel.lineBreakMode = UILineBreakModeTailTruncation; 
    } 
    return titleLabel; 
} 

- (void) frameTitleLabel { 
    self.titleLabel.frame = self.navigationController.navigationBar.frame; 
} 

Nguyên tắc trước hết là tiêu đề của bạn có thể chảy trên đầu bất kỳ nút nào bạn có trong navBar nếu bạn không cẩn thận và đặt tiêu đề quá dài. Nhưng, IMO, đó là ít hơn rất nhiều vấn đề để đối phó với hơn 1) Tiêu đề không tập trung một cách chính xác khi bạn có một rightBarButton hoặc 2) Tiêu đề không xuất hiện nếu bạn có một leftBarButton.

+1

Cảm ơn nhận xét. Như một lưu ý, khi tôi triển khai cách tiếp cận của bạn, chế độ xem được tạo không biến mất khi nhấn nút quay lại. –

3

Tôi có cùng một vấn đề; Tôi chỉ bằng cách nào đó giải quyết vấn đề này bằng cách tính toán chiều dài tiêu đề và thiết lập chiều rộng khung nhãn cho phù hợp. Mặc dù đây không phải là một hoàn hảo nhưng có thể quản lý được. Đây là mã.

label = [[UILabel alloc] init]; 
label.backgroundColor = [UIColor clearColor]; 
label.font = [ UIFont fontWithName: @"XXII DIRTY-ARMY" size: 32.0 ]; 
label.shadowColor = [UIColor colorWithWhite:0.0 alpha:0.0f]; 
label.textAlignment = UITextAlignmentCenter; 
label.textColor =[UIColor orangeColor]; 
//label.text=categoryTitle; 
CGFloat verticalOffset = 2; 
NSString *reqSysVer = @"5.0"; 
NSString *currSysVer = [[UIDevice currentDevice] systemVersion]; 
if ([currSysVer compare:reqSysVer options:NSNumericSearch] != NSOrderedAscending)   
{ 
    if (categoryTitle.length > 8) 
    { 
    label.frame = CGRectMake(0, 0, 300, 44); 
    }else { 
     label.frame = CGRectMake(0, 0, 80, 44); 
    } 

    self.navigationItem.titleView = label; 
    self.navigationItem.title=label.text; 
    [[UINavigationBar appearance] setTitleVerticalPositionAdjustment:verticalOffset forBarMetrics:UIBarMetricsDefault]; 
    [[UIBarButtonItem appearance] setTintColor:[UIColor newBrownLight]]; 


} 
0

Điều gì làm việc cho tôi là cập nhật khung tiêu đềView trong phương thức viewDidAppear.

- (void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 

    UIView *titleView = self.navigationItem.titleView; 
    CGRect navBarFrame = self.navigationController.navigationBar.frame; 
    [titleView setFrame:CGRectMake((CGRectGetWidth(navBarFrame) - TitleWidth)/2, (CGRectGetHeight(navBarFrame) - TitleHeight)/2, TitleWidth, TitleHeight)]; 
}