2013-11-15 11 views
9

Tworzę aplikację i poproszono mnie o umieszczenie logo na pasku nawigacyjnym, ale także o wykroczenie poza granice paska, obejmującego część mojego widoku. Tak właśnie powinno zostać umieszczone (biały okrąg to logo).Jak dodać obraz do paska nawigacyjnego UINavigationController?

enter image description here

Ze względu na skomplikowaną strukturę widok kontrolerów w tej aplikacji chcę użyć UINavigationController, ale wydaje się, może sprawić umieszczenie logo nieco bardziej problematyczne.

Co to jest dobry sposób na zrobienie tego? (ponieważ oczywiste jest, że umieszczenie logo jako tytułowego obrazu paska nawigacyjnego nie wchodzi w grę z powodu dziwnego umieszczenia)

Myślałem o tym, czy zrobię z niego wyrób keyWindow, czy też navigationController.view. Czy pierwszy może spowodować odrzucenie mojej aplikacji przez Apple?

+0

Niedawno po odpowiedź na podobne pytanie - spojrzeć na http://stackoverflow.com/questions/19878288/ios-custom-shape-navigation-bar – Kuba

Odpowiedz

13

Jeśli chcesz dodać obraz z UIViewController nie z podklasy UINavigationController można zrobić coś takiego:

-(void)addImageOnTopOfTheNavigationBar { 
    UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"yourImage"]]; 

    imageView.frame = CGRectMake(....); //set the proper frame here 
    [self.navigationController.view addSubview:imageView]; 

} 
2

Pasek nawigacyjny ma coś, co nazywa titleView. Teraz może to być dowolny widok. Ale po prostu umieściłem na nim obraz.

Kopalnia znajduje się w funkcji init.

self.navigationItem.titleView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"logo"]]; 
+0

Jak powiedziałem w moim pytaniem jest to prawdopodobnie nie jest to dobry pomysł. Głównie dlatego, że zostanie przeskalowany, aby zmieścił się w środku paska nawigacyjnego, podczas gdy ja potrzebuję rozciągnąć go poza granice paska. – johnyu

+0

ah wystarczająco fair :). musisz dodać podzbiór taki jak danypata. Upewnij się, że ustawiłeś autoodmiar, ale w przeciwnym razie nie pozostaniesz w środku – mashdup

1
UIImage*image = [UIImage imageNamed:@"logo"]; 

float targetHeight = self.navigationController.navigationBar.frame.size.height; 
float logoRatio = image.size.width/image.size.height; 
float targetWidth = targetHeight * logoRatio; 

UIImageView*logoView = [[UIImageView alloc] initWithImage:image]; 
// X or Y position can not be manipulated because autolayout handles positions. 
//[logoView setFrame:CGRectMake((self.navigationController.navigationBar.frame.size.width - targetWidth)/2 , (self.navigationController.navigationBar.frame.size.height - targetHeight)/2 , targetWidth, targetHeight)]; 
[logoView setFrame:CGRectMake(0, 0, targetWidth, targetHeight)]; 
self.navigationItem.titleView = logoView; 

// How much you pull out the strings and struts, with autolayout, your image will fill the width on navigation bar. So setting only height and content mode is enough/ 
[logoView setContentMode:UIViewContentModeScaleAspectFit]; 

/* Autolayout constraints also can not be manipulated since navigation bar has immutable constraints 
self.navigationItem.titleView.translatesAutoresizingMaskIntoConstraints = false; 

NSDictionary*metricsArray = @{@"width":[NSNumber numberWithFloat:targetWidth],@"height":[NSNumber numberWithFloat:targetHeight],@"margin":[NSNumber numberWithFloat:20]}; 
NSDictionary*viewsArray = @{@"titleView":self.navigationItem.titleView}; 

[self.navigationItem.titleView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|-(>margin=)-H:[titleView(width)]-(>margin=)-|" options:NSLayoutFormatAlignAllCenterX metrics:metricsArray views:viewsArray]]; 
[self.navigationItem.titleView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[titleView(height)]" options:0 metrics:metricsArray views:viewsArray]]; 

NSLog(@"%f", self.navigationItem.titleView.width); 
*/ 

Więc my rzeczywiście potrzebujemy

UIImage*image = [UIImage imageNamed:@"logo"]; 
UIImageView*logoView = [[UIImageView alloc] initWithImage:image]; 
float targetHeight = self.navigationController.navigationBar.frame.size.height; 
[logoView setFrame:CGRectMake(0, 0, 0, targetHeight)]; 
[logoView setContentMode:UIViewContentModeScaleAspectFit]; 

self.navigationItem.titleView = logoView; 
2

Można to zrobić z IB łatwo:

  1. Dodaj zdjęcie do kontrolera (nie w widoku hierarchii) enter image description here enter image description here
  2. Połącz widok tytułowy UINavigationItem z tym obrazkiem enter image description here
  3. Et voila! enter image description here