2010-02-14 41 views
11

thể trùng lặp:
How to add background image on iphone Navigation bar?iPhone - Navigationbar Tuỳ chỉnh nền

Tôi đang tìm kiếm một cách để có một thanh điều hướng tùy chỉnh và cần phải có một nền tùy chỉnh thanh điều hướng để đạt được điều này . Tôi đã nhìn xung quanh để làm thế nào để làm điều này, nhưng không thể tìm thấy một giải pháp. Nếu bất cứ ai có giải pháp, giúp đỡ được nhiều đánh giá cao.

+0

Có giải pháp nhiều giải pháp thay thế ở đây: http://stackoverflow.com/questions/1692487/how-to-add-background-image-on-iphone-navigation-bar –

Trả lời

6

Bạn chỉ có thể thêm chế độ xem phụ (UIImageView) vào navaigationBar, chỉ là lớp con UIView.

UINavigationBar nb = [[UINavigationBar alloc]init]; 
[nb addSubview: foo]; 
[nb release]; 

Dưới đây là một bài diễn đàn mô tả làm thế nào để bọc này lên thành một loại: http://discussions.apple.com/thread.jspa?threadID=1649012&tstart=0

10

(bổ sung để đáp ứng Andrew Johnson)

Các Apple.com liên kết bài gồm 3 hoặc 4 giải pháp khác nhau , hầu hết chỉ có "một nửa" công việc. Tôi nghĩ rằng thanh lịch nhất/hiệu quả của họ là một trong những điều này:

@implementation UINavigationBar (CustomImage) 
- (void)drawRect:(CGRect)rect { 
    UIImage *image = [UIImage imageNamed: @"NavigationBar.png"]; 
    [image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)]; 
} 
@end 

TUY NHIÊN ... nó không tốt-thực hành ObjC để od mà như một phạm trù (nên được ghi đè), và nó có một số vấn đề của nó sở hữu.

Vì vậy, một giải pháp tổng quát hơn và mạnh mẽ là ở đây:

http://samsoff.es/posts/customize-uikit-with-method-swizzling

+0

Cảm ơn để liên kết với tôi Adam :) Bạn đúng rằng phương pháp ghi đè với các loại là một thực tế rất xấu. –

+0

Ai đó đã bỏ phiếu này mà không có lời giải thích? Không chắc chắn lý do tại sao. Mặc dù tôi sẽ thêm: toàn bộ câu hỏi này (và hầu hết các câu trả lời) chỉ là iOS 2/3/4 - iOS 5 có một hệ thống hoàn toàn mới để thực hiện việc này. Câu trả lời vẫn hoạt động cho những người đang làm iOS4. – Adam

14

Kể từ iOS5, bạn có thể dễ dàng thiết lập một nền tùy chỉnh, với phương pháp setBackgroundImage: forBarMetrics: Nhưng bạn phải kiểm tra xem điện thoại của người dùng có hệ điều hành phù hợp.

if ([self.navigationController.navigationBar respondsToSelector:@selector(setBackgroundImage:forBarMetrics:)]) 
{ 
    [self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"texture.png"] 
                forBarMetrics:UIBarMetricsDefault]; 
} 

Đây là giải pháp đẹp hơn, là nguyên nhân trong tài liệu.

+0

Cho đến khi người dùng không chạy iOS5 chạy ứng dụng của bạn – JoeCortopassi

+3

Có, nhưng có một kiểm tra cho điều đó. Bạn có thể làm một cái gì đó khác trong mệnh đề else. – Martin

3

Sao chép nội dung này vào chế độ xemDidLoad. Nó sẽ kiểm tra iOS 5 và sử dụng các phương pháp ưa thích, nếu không nó sẽ thêm một subview cho navBar cho iOS phiên bản < 5.0. Điều này sẽ hoạt động với điều kiện là hình nền tùy chỉnh của bạn không có trong suốt.

float version = [[[UIDevice currentDevice] systemVersion] floatValue]; 
NSLog(@"%f",version); 
UIImage *backgroundImage = [UIImage imageNamed:@"myBackgroundImage.png"]; 
if (version >= 5.0) { 
    [self.navigationController.navigationBar setBackgroundImage:backgroundImage forBarMetrics:UIBarMetricsDefault]; 
} 
else 
{ 
    [self.navigationController.navigationBar insertSubview:[[[UIImageView alloc] initWithImage:backgroundImage] autorelease] atIndex:1]; 
}