2013-03-04 3 views
18

나는이 코드 조각을 UIViewController의 viewDidLoad에 사용했습니다. 나는 오류가 없다. 이미지가 존재합니다. 나는 배경을 얻지 만 이미지는 얻지 못한다. 이미지는 일종의 로고입니다.UIViewController의 navigationBar의 가운데에 이미지를 두는 방법은 무엇입니까?

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

U가 nav bar의 이미지 (로고) 센터를 놓은 다음 제목에 대해 wht를 입력하면? – Hari1251

+0

탐색 컨트롤러 자체의 탐색 항목이 아닌 탐색 스택에 푸시 된 뷰 컨트롤러의 탐색 항목을 설정해야합니다. 내 대답을 보라. – jhabbott

답변

47

UINavigationController 탐색 모음을 관리하고 사용

logoView.frame = CGRectMake(initialize frame here); 

하여 프레임의 지정 네비게이션 스택에. 보기를 로고로 변경하려면 로고를 사용하는보기 컨트롤러 (예 : 루트보기 컨트롤러 또는 스택에 푸시당하는 다른보기 컨트롤러)에서 설정해야합니다.

보기 컨트롤러의 viewDidLoad이 같은

어떻게 좀 :

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

= ?? 나는 180 * 40으로 시도했지만 흐려지고있다. – Krunal

+0

긴 시간이 영업 이익과 대답 때문에,하지만이에 끊었있어'self.navigationItem.titleView = logoView' 대신 사용해야합니다'self.navigationController.navigationBar.topItem.titleView = logoView' 새로운는'UIViewController'는 경우 topItem'는'viewDidAppear' 화재 (여전히'viewDidLoad'와'viewWillAppear'에서 이전 뷰 컨트롤러를 반영)까지 밀렸다 새로운 뷰 컨트롤러를 반영하지 않습니다 '때문에 추진되고. – spurgeon

+0

누구나 titleView의 프레임을 알고 있습니까? –

1

당신은 그런 최상위 뷰 컨트롤러의 navigationItem 특성을 보면 다음과 같은

[self.navigationItem setTitleView:logoView]; 
+0

당신의 대답은 정답입니다, 다른 모든 사람들은 네비게이션 바에 이미지를 넣는 방법을 지정합니다. 이 질문은 네비게이션 바에 이미지를 '센터링하는 방법'을 분명하게 묻습니다. 고맙습니다. – oyalhi

+0

그런데, 나는 다음과 같은 코드를 가지고있다. 그러나 여전히 이미지의 중심에 있지 않습니다. 네비게이션 바의 왼쪽/오른쪽에있는 항목에 따라 로고는 화면이 아닌 빈 공간에 배치됩니다. 어떤 포인터?'화상이있는 UIImage = (이름 "some_logo") 보자!'' screenWidth UIScreen.mainScreen =()을 할 수 있도록 'bounds.width' 이미지 뷰의 UIImageView = (프레임 :. CGRect (X : 0, Y : 0, 폭 : screenWidth, 신장있는 UIImage의 크기 타이틀되어야 무엇 42))'' imageView.image = image' 'imageView.contentMode .ScaleAspectFit' – oyalhi

9

먼저 우리가보기를 만들 필요가 : 귀하의 경우

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

, 잘못된 탐색 항목을 설정하는 탐색 모음과 동일한 크기 다음 이미지보기를 추가하고 탐색 모음에서 센터 모양을 설정하여 프레임을 설정합니다. 모든 iOS 버전에서 작동하며 자동으로 fra를 사용합니다. 나는 장치 (망막 또는 정상) 당 같은 크기 및 마술처럼 작동합니다.

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

스위프트 : 당신이 의미 아마도하지 무엇

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

,하지만 난 그렇게 경우에 당신 ', 네비게이션 바의 중심 배경 이미지을 제공하는 방법을 찾고이 페이지에 달렸다 그걸로 여기 있습니다 ... 여기에 하나의 방법이 있습니다.

another answer에서 약간 훔친 다음 이미지를 전면 및 배경으로 분리 한 다음 배경을 늘리고 포 그라운드를 중앙에 놓은 다음 이미지를 빌드하여 탐색 모음의 배경 이미지로 설정할 수 있습니다. 이미지를 구축하는 것은과 같이 작동합니다

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

여기 내가 사용거야.

물론 왼쪽 및 오른쪽 바 버튼 항목과 충돌하지 않도록 더 많은 제약이 필요할 수 있습니다.

+0

미친 양의 답변을 시도한 후 마침내 성공했습니다. 고맙습니다! –

관련 문제