2013-11-15 2 views
9

Я делаю приложение, и мне было предложено поставить логотип над навигационной панелью, но также выйти за пределы границ бара, покрывая часть моего представления. Вот как это должно быть помещено (белый круг - это логотип).Как добавить изображение поверх навигационной панели UINavigationController?

enter image description here

Благодаря сложной структуре вид контроллеров в этом приложении я хочу использовать UINavigationController, но, кажется, это может сделать размещение логотипа немного более проблематичным.

Каков хороший способ сделать это? (поскольку, очевидно, размещение логотипа в качестве титульного изображения панели навигации не может быть и речи из-за странного размещения)

Я думал о том, чтобы сделать его подвид KeyWindow или navigationController.view. Может ли первая причина отклонения моего приложения Apple?

+0

Я недавно пост ответ на подобный вопрос - посмотрите на http://stackoverflow.com/questions/19878288/ios-custom-shape-navigation-bar – Kuba

ответ

13

Если вы хотите добавить изображение из UIViewController не из подкласса UINavigationController вы можете сделать что-то вроде этого:

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

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

} 
2

Навигационная панель имеет то, что называется titleView. Теперь это может быть любое представление. Но я просто положил на него изображение.

Шахта находится в функции init.

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

Как я уже говорил в моем вопросе, это вероятно, не очень хорошая идея. В основном потому, что он будет масштабироваться, чтобы соответствовать середине панели навигации, в то время как мне нужно, чтобы он растянулся за пределами полосы. – johnyu

+0

ах достаточно справедливо :). вам нужно добавить subview, как сказал danypata. Убедитесь, что вы установили авторезистор, хотя в противном случае он не останется посередине – 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); 
*/ 

Так что все мы на самом деле нужно

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

Вы можете сделать это с IB легко:

  1. Добавьте изображение к контроллеру (не в иерархии вида) enter image description here enter image description here
  2. Подключить ваш UINavigationItem к этому изображению enter image description here
  3. Et voilà! enter image description here
Смежные вопросы