Странное поведение titleView, которое не появляется, пока не нажата кнопка назад - PullRequest
0 голосов
/ 08 декабря 2011

В viewDidLoad У меня есть UINavigationBar с пользовательским фоном, реализованным следующим образом:

[self.navigationController.navigationBar insertSubview:[[UIImageView alloc] initWithImage:[UIImage imageNamed:nav_bg_image]] atIndex:100];

На вершине стека (назовите его RVC) У меня есть следующий полный код:

UIImageView *logoView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:navbar_image_logo]];
[self.navigationController.navigationBar insertSubview:[[UIImageView alloc] initWithImage:[UIImage imageNamed:nav_bg_image]] atIndex:100];
[self.navigationItem setTitleView:logoView];
[logoView release];

Это прекрасно работает.Однако, когда я помещаю новый VC в стек и использую тот же код в viewDidLoad

UIImageView *logoView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:navbar_image_logo]];
[self.navigationController.navigationBar insertSubview:[[UIImageView alloc] initWithImage:[UIImage imageNamed:nav_bg_image]] atIndex:1];
[self.navigationItem setTitleView:logoView];
[logoView release];
UIBarButtonItem *hButton = [[UIBarButtonItem alloc] initWithTitle:@"Filters" style:UIBarButtonItemStylePlain target:self action:@selector(filtersAction)];
self.navigationItem.rightBarButtonItem = hButton;
[hButton release];

, не появляется ни кнопка «Фильтры», ни titleView imageView.Однако я знаю, что кнопка фильтров была добавлена ​​в пользовательский интерфейс, потому что, если я щелкну в области, которая должна появиться, действие будет выполнено.

Кроме того, когда я развернусь до подробного вида DVC и возвращайтесь, внезапно появляется titleView (logoView)!

Я подозреваю, что это какая-то проблема с памятью, но я не смог ее решить.

Ответы [ 2 ]

2 голосов
/ 08 декабря 2011

Есть упоминание о проблеме, с которой вы сталкиваетесь при заказе на iDev Recipes Как приложения iPhone для Instagram / Reeder / DailyBooth реализуют пользовательские панели навигации с кнопками назад переменной ширины?

По сути, вы добавляете фон неправильно.

Поддержка только iOS 5
Реализуйте метод как setBackgroundImage:forBarMetrics:

Поддержка старых iOS + iOS 5

  1. Подкласс UINavigationBar и реализация drawRect

    //.h
    @interface CustomNavigationBar : UINavigationBar
    @end
    
    //.m
    @implementation CustomNavigationBar
    
    - (void)drawRect:(CGRect)rect;
    {
        UIImage *image = [[UIImage imageNamed: @"BackgroundImage"] stretchableImageWithLeftCapWidth:0 topCapHeight:0];
        [image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
    }
    
    @end
    
  2. Чтобы получить UINavigationController для использования вашего подкласса, вам нужно создать его с использованием xib.

enter image description here


Если вы все настроили в коде, вам все равно нужно будет использовать перо для этого. Я использую перо без File's Owner и содержит только Navigation Controller, который настроен на использование CustomNavigationBar и не имеет viewControllers

В этом случае я настроил это в коде так:

// Load my nib with only a Navigation Controller and custom navigationBar
NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"CustomNavigationController" owner:nil options:nil];

// The only top level object will be my navigationController
UINavigationController *navigationController = [topLevelObjects objectAtIndex:0];

// Push a view controller to be the rootViewController
[navigationController pushViewController:rootViewController animated:NO];

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

1 голос
/ 08 декабря 2011

Использование вами метода insertSubView:atIndex: выглядит подозрительно.У вас действительно есть 100 подвидов в этом представлении?

...