Подвид UINavigationBar скрывает правый UIBarButtonItem - PullRequest
2 голосов
/ 28 октября 2009

В контроллере представления корневой таблицы я добавляю подпредставление с изображением:

[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: будет вызван, так что кнопка «есть», предположим, что она не отображается.

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

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

Обновление: кнопка «Назад» отображается правильно, но добавляется системой ...

Ответы [ 2 ]

0 голосов
/ 28 октября 2009

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

self.navigationItem.titleView = imageView;

Я думаю, UINavigationBar отображает UINavigationItem s в подпредставлении, и вы добавляете UIImageView поверх этого подпредставления.

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

0 голосов
/ 28 октября 2009

Лучший способ добавить изображение в 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

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

...