iPhone - Настраиваемая панель UINavigation вдоль всего стека

Я хочу установить изображение и метку в центре моего UINavigationBar вдоль всего моего стека навигации.

Что я сейчас делаю, так это добавляю его в заголовок элемента навигации. «Проблема» с этим подходом заключается в том, что я должен вызывать этот метод в viewDidLoad для каждого контроллера представления, который я помещаю в свой стек навигации. Другой способ - добавить UILable и UIImageView непосредственно в UINavigationBar, однако именно поэтому я должен сам вычислять центр, и, кроме того, я читал, что это не рекомендуемый подход. Любая идея, как получить то, что я хочу?

Мой код:

    CGRect  navTitle = controller.navigationController.navigationBar.bounds;
    CGFloat aHeight = navTitle.size.height;

    UIView* container = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 163, aHeight)];


    UIImage* statusImg = [UIUtils   getStatusImage]; 

    UIImageView *statusImage = [[UIImageView alloc] initWithFrame:CGRectMake(0,aHeight/2-statusImg.size.height/2, 33., 32.)];
    statusImage.autoresizingMask = UIViewAutoresizingNone;
    statusImage.image = statusImg;
    statusImage.backgroundColor = [UIColor clearColor];
    [statusImage setTag:1];
    [statusImage setHidden:NO];

initWithFrame:CGRectMake(statusImage.frame.origin.x + 33. + 3, 0, 130., navTitle.size.height)];

    UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(statusImage.frame.origin.x + 33. + 3, 0, 130., navTitle.size.height)];
    titleLabel.textAlignment = UITextAlignmentLeft;
    titleLabel.lineBreakMode = UILineBreakModeTailTruncation;
    titleLabel.textColor = [UIColor whiteColor];
    titleLabel.font = [UIFont boldSystemFontOfSize:20.];
    titleLabel.shadowOffset = CGSizeMake(1, -1);
    titleLabel.opaque = NO;
    titleLabel.backgroundColor = [UIColor clearColor];
    [titleLabel setTag:2];

    [container addSubview:statusImage];
    [container addSubview:titleLabel];
    controller.navigationItem.titleView = container;
[statusImage release];
[titleLabel release];
    [container release];

person Idan    schedule 04.05.2011    source источник


Ответы (1)


Нашел хороший способ сделать это:

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

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated

Внутри этой функции достаточно получить viewController и работать с его элементом навигации.

person Idan    schedule 07.05.2011