2

В корневом контроллере табличных добавить подвид, который содержит изображение:UINavigationBar подтаблица скрывается правый UIBarButtonItem

[self.navigationController.navigationBar addSubview:imageView]; 

Затем в контроллере представления дочерней таблицы, что я нажимаю на стек я поставил правильный UIBarButtonItem :

UIBarButtonItem *rightButton = [[UIBarButtonItem alloc] initWithTitle:@"Right" style:UIBarButtonItemStylePlain target:self action:@selector(rightAction:)]; 
self.navigationItem.rightBarButtonItem = rightButton; 
[rightButton release]; 

Я не могу понять, почему кнопка не отображается в навигационной панели. Если я коснусь (пустое пространство), метод rightAction: вызывается так, что кнопка «есть», ожидайте, что он не будет отображаться.

Я попытался отправить изображение viewview назад в навигационную панель, но безрезультатно. Это имеет смысл, поскольку кнопка на самом деле принадлежит UINavigationItem в любом случае ...

Кто-нибудь знает, как я могу правильно отобразить эту кнопку?

Update: кнопка назад действительно корректно отображаться, но она дополнена системой, хотя ...

ответ

0

лучший способ, чтобы добавить изображение к UINavigationBar является подкласс или сделать категорию и переопределить метод drawRect :

//         #Lighter r,g,b,a   #Darker r,g,b,a 
#define MAIN_COLOR_COMPONENTS  { 0.153, 0.306, 0.553, 1.0, 0.122, 0.247, 0.482, 1.0 } 
#define LIGHT_COLOR_COMPONENTS  { 0.478, 0.573, 0.725, 1.0, 0.216, 0.357, 0.584, 1.0 } 

@implementation UINavigationBar (UINavigationBarCategory) 

- (void)drawRect:(CGRect)rect { 
    if (imageReady) { 
     UIImage *img = [UIImage imageNamed: @"navigation_background.png"]; 
     [img drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)]; 
    } else { 
     // Render yourself instead. 
     // You will need to adjust the MAIN_COLOR_COMPONENTS and LIGHT_COLOR_COMPONENTS to match your app 

     // emulate the tint colored bar 
     CGContextRef context = UIGraphicsGetCurrentContext(); 
     CGFloat locations[2] = { 0.0, 1.0 }; 
     CGColorSpaceRef myColorspace = CGColorSpaceCreateDeviceRGB(); 

     CGFloat topComponents[8] = LIGHT_COLOR_COMPONENTS; 
     CGGradientRef topGradient = CGGradientCreateWithColorComponents(myColorspace, topComponents, locations, 2); 
     CGContextDrawLinearGradient(context, topGradient, CGPointMake(0, 0), CGPointMake(0,self.frame.size.height/2), 0); 
     CGGradientRelease(topGradient); 

     CGFloat botComponents[8] = MAIN_COLOR_COMPONENTS; 
     CGGradientRef botGradient = CGGradientCreateWithColorComponents(myColorspace, botComponents, locations, 2); 
     CGContextDrawLinearGradient(context, botGradient, 
     CGPointMake(0,self.frame.size.height/2), CGPointMake(0, self.frame.size.height), 0); 
     CGGradientRelease(botGradient); 

     CGColorSpaceRelease(myColorspace); 


     // top Line 
     CGContextSetRGBStrokeColor(context, 1, 1, 1, 1.0); 
     CGContextMoveToPoint(context, 0, 0); 
     CGContextAddLineToPoint(context, self.frame.size.width, 0); 
     CGContextStrokePath(context); 

     // bottom line 
     CGContextSetRGBStrokeColor(context, 0, 0, 0, 1.0); 
     CGContextMoveToPoint(context, 0, self.frame.size.height); 
     CGContextAddLineToPoint(context, self.frame.size.width, self.frame.size.height); 
     CGContextStrokePath(context); 
    } 
} 

@end 

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

+0

Я мог бы подклассифицировать UINavigationBar, но свойство доступно только для чтения в UINavigationController ... другое дело, что «образ» фактически извлекается с сервера, поэтому его нужно установить «на лету». – nicktmro

+0

Я принял ваш ответ, но я был бы очень признателен за ваш вход со следующим: если мое изображение не готово, когда я показываю навигатор, я получаю черный фон. Любые изменения, которые я мог бы вернуть к голубому фону/стилю по умолчанию, не используя изображение? – nicktmro

+0

да, я обновлю код – coneybeare

0

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

self.navigationItem.titleView = imageView; 

Я предполагаю UINavigationBar дисплеи в UINavigationItem с в подвид, и вы складывали свой UIImageView на вершине этого подвид.

В одном из моих представлений я показываю ярлык и изображение рядом с ним. Я думаю, что я просто добавил представление метки и изображения в представление, которое затем я использовал для titleView.

+0

Это нормально, но titleView не распространяется по всему экрану. Я подозреваю, что это всего лишь 300 пикселей, а не 320. – nicktmro

+0

Я думаю, вы хотите, чтобы это было фоновым изображением? Хорошо, тогда, возможно, попробуйте добавить свой imageView в индекс 0 (-insertSubview: atIndex :) –

Смежные вопросы