2013-03-04 36 views
18

Tôi có đoạn mã này được sử dụng trong viewDidLoad của UIViewController. Tôi không có lỗi. Hình ảnh tồn tại. Tôi có nền nhưng không phải hình ảnh. Hình ảnh là một loại logo.Làm thế nào để đặt một hình ảnh ở trung tâm của navigationBar của một UIViewController?

if ([self.navigationController.navigationBar respondsToSelector:@selector(setBackgroundImage:forBarMetrics:)]) { 

    /* Background of navigationBar. */ 
    UIImage * navigationBarImage = [UIImage imageNamed:@"01_navbar_portrait.png"]; 
    [self.navigationController.navigationBar setBackgroundImage:navigationBarImage forBarMetrics:UIBarMetricsDefault]; 

    /* Image in navigationBar */ 
    UIImage * logoInNavigationBar = [UIImage imageNamed:@"01_logo.png"]; 
    UIImageView * logoView = [[UIImageView alloc] init]; 
    [logoView setImage:logoInNavigationBar]; 
    self.navigationController.navigationItem.titleView = logoView; 

} 
+0

nếu u đặt trung tâm hình ảnh (biểu tượng) của thanh điều hướng, sau đó chọn tiêu đề u r? – Hari1251

+0

Bạn cần đặt mục điều hướng của bộ điều khiển chế độ xem được đẩy lên ngăn điều hướng, không phải mục điều hướng của trình điều khiển điều hướng. Xem câu trả lời của tôi. – jhabbott

Trả lời

47

Các UINavigationController quản lý thanh điều hướng bằng cách nhìn vào navigationItem sở hữu của hầu hết trên bộ điều khiển xem trên ngăn điều hướng. Vì vậy, để thay đổi chế độ xem thành biểu trưng, ​​bạn cần thiết lập điều này trong bộ điều khiển chế độ xem sử dụng biểu trưng (nghĩa là bộ điều khiển chế độ xem gốc hoặc một bộ điều khiển khác được đẩy lên ngăn xếp).

Đỗ một cái gì đó như thế này trong viewDidLoad của bộ điều khiển xem của bạn:

UIImage* logoImage = [UIImage imageNamed:@"logo.png"]; 
self.navigationItem.titleView = [[UIImageView alloc] initWithImage:logoImage]; 

Trong trường hợp của bạn, bạn đang thiết lập các mục chuyển hướng sai:

// Oops... 
self.navigationController.navigationItem.titleView = logoView; 
// Should be this: 
self.navigationItem.titleView = logoView; 
+4

kích thước của UIImage nên là gì cho tiêu đề ?? tôi đã thử với 180 * 40 nhưng nó bị mờ. – Krunal

+0

Thời gian dài kể từ khi OP và trả lời, nhưng tôi đã treo lên trên này: 'self.navigationItem.titleView = logoView' nên được sử dụng thay vì' self.navigationController.navigationBar.topItem.titleView = logoView' khi một 'UIViewController' mới là bị đẩy vì 'topItem' không phản ánh bộ điều khiển chế độ xem mới đã được đẩy cho đến khi các vụ cháy' viewDidAppear' (nó vẫn phản ánh bộ điều khiển xem cũ trong 'viewDidLoad' và' viewWillAppear'). – spurgeon

+0

Bất cứ ai cũng biết khung của titleView? –

1

Bạn chỉ cần xác định nó là khung bởi

logoView.frame = CGRectMake(initialize frame here); 

Sau đó sử dụng sau

[self.navigationItem setTitleView:logoView]; 
+0

Câu trả lời của bạn là câu trả lời đúng, tất cả các câu trả lời khác chỉ định 'cách' để đặt hình ảnh trên thanh điều hướng. Câu hỏi rõ ràng yêu cầu 'cách căn giữa hình ảnh trên thanh điều hướng. Cảm ơn bạn. – oyalhi

+0

Có nói rằng, tôi có đoạn mã sau; tuy nhiên, nó vẫn không làm trung tâm hình ảnh. Tùy thuộc vào những gì có ở bên trái/bên phải của thanh điều hướng, biểu tượng tập trung vào khoảng trống, KHÔNG trên màn hình. Bất kỳ con trỏ?'let image = UIImage (có tên:" some_logo ")!' 'let screenWidth = UIScreen.mainScreen(). bounds.width' ' cho imageView = UIImageView (khung: CGRect (x: 0, y: 0, width: screenWidth, height: 42)) ' ' imageView.image = image' 'imageView.contentMode = .ScaleAspectFit' – oyalhi

9

Đầu tiên chúng ta phải tạo ra một cái nhìn có kích thước tương tự như thanh điều hướng sau đó thêm chế độ xem hình ảnh và đặt khung của nó là trung tâm trong thanh điều hướng. Nó hoạt động cho tất cả phiên bản ios và nó tự động mất tôi kích thước theo thiết bị (võng mạc hoặc bình thường) và hoạt động như ma thuật.

UIView *headerView = [[UIView alloc] init]; 
headerView.frame = CGRectMake(0, 0, 320, 44); 

UIImageView *imgView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Header.png"]]; 
imgView.frame = CGRectMake(75, 0, 150, 44); 
imgView.contentMode = UIViewContentModeScaleAspectFit; 

[headerView addSubview:imgView]; 

navigationCtrl.navigationBar.topItem.titleView = headerView; 

[headerView release]; 
[imgView release]; 
5

Swift:

var logoImage:UIImage = UIImage(named: "logo_text")! 
self.navigationItem.titleView = UIImageView(image: logoImage) 
2

Có lẽ không phải những gì bạn có nghĩa là, nhưng tôi chạy vào trang này tìm kiếm một cách để cung cấp một trung hình nền cho thanh điều hướng, vì vậy trong trường hợp bạn' ở đây vì điều đó ... đây là một cách.

Ăn cắp một chút từ another answer, bạn có thể chia hình ảnh thành nền trước và nền sau đó tạo hình ảnh mới trải dài nền và căn giữa nền trước rồi đặt làm hình nền của thanh điều hướng. Xây dựng hình ảnh hoạt động như vậy:

// build an image by stretching the bg, then merging it with the fg 
CGSize barSize = self.navController.navigationBar.frame.size; 
UIImage *fg = [UIImage imageNamed:@"some_fg"]; 
UIImage *bg = [[UIImage imageNamed:@"some_bg"] 
       resizableImageWithCapInsets:UIEdgeInsetsMake(0.f,1.f,0.f,1.f)]; 
UIGraphicsBeginImageContextWithOptions(barSize, NO, 0.0); 
[bg drawInRect:CGRectMake(0, 0, barSize.width, barSize.height)]; 
[fg drawInRect:CGRectMake((barSize.width-fg.size.width)/2.f, 
          0, 
          fg.size.width, 
          fg.size.height)]; 
// grab the merged images 
UIImage *img = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
2
extension UINavigationController { 
func addLogoImage(image: UIImage, navItem: UINavigationItem) { 
    let imageView = UIImageView(image: image) 
    imageView.contentMode = .scaleAspectFit 
    imageView.translatesAutoresizingMaskIntoConstraints = false 

    let view = UIView(frame: CGRect(x: 0, y: 0, width: 200, height: 44)) 
    view.addSubview(imageView) 

    navItem.titleView = view 
    imageView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true 
    imageView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true 
    imageView.heightAnchor.constraint(equalTo: view.heightAnchor).isActive = true 
    imageView.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true 

    view.heightAnchor.constraint(equalTo: navigationBar.heightAnchor).isActive = true 
    view.centerXAnchor.constraint(equalTo: navigationBar.centerXAnchor).isActive = true 
    view.centerYAnchor.constraint(equalTo: navigationBar.centerYAnchor).isActive = true 
} 
} 

Đây là những gì tôi đang sử dụng.

Tất nhiên, bạn có thể cần nhiều ràng buộc hơn một chút, để không đụng độ với các mục nút phải và trái.

+0

Sau khi thử một số lượng câu trả lời điên rồ, cuối cùng bạn cũng đã làm việc. Cảm ơn bạn! –

Các vấn đề liên quan