Память предупреждение удаляет кнопки UINavigationBar - PullRequest
0 голосов
/ 23 августа 2010

Я переопределил drawLayer: inContext: на UINavigationBar в категории, чтобы я мог поместить туда собственное изображение. Я ненавижу это, но мой клиент был непреклонен.

В результате мне пришлось прибегнуть к довольно уродливым хакерским действиям, чтобы добиться успеха. Мне пришлось поместить новый метод в эту категорию, чтобы поместить заголовок в заголовок панели навигации, и я должен вызывать его явно в -viewDidAppear.

Я могу жить с этим. Реальная проблема в том, что когда памяти становится мало, кажется, что UINavigationBar выгружает свои подпредставления, включая мою кнопку назад! Я действительно не знаю, как оправиться от этого.

Вот моя категория UINavigationBar. Я получил этот код отсюда на SO, я думаю; Основная графика в основном заставляет мою голову кружиться.

@implementation UINavigationBar (background)

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx
{
    if([self isMemberOfClass: [UINavigationBar class]]){
        UIImage *image = [UIImage imageNamed:@"top_bar.png"];
        //CGContextClip(ctx);
        CGContextTranslateCTM(ctx, 0, image.size.height - 20);
        CGContextScaleCTM(ctx, 1.0, -1.0);
        CGContextDrawImage(ctx, CGRectMake(0, 2, self.frame.size.width, self.frame.size.height), image.CGImage);
    }
}

-(void)customTitle:(NSString *)text
{
    UINavigationItem *top = self.topItem;
    [[top.titleView subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)];

    UILabel *title = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 200, 40)];
    title.textAlignment = UITextAlignmentCenter;
    title.text = text;
    title.textColor = [UIColor blackColor];
    title.font = [UIFont boldSystemFontOfSize:16];
    title.backgroundColor = [UIColor clearColor];
    top.titleView = title;
    [title release];

}

Есть ли более простой способ? Если нет, то как я могу сказать UINavigationBar: «Перезагрузите себя с помощью подпредставлений, которые у вас должны быть»?

ОБНОВЛЕНИЕ: Попытка переопределения -drawRect вместо. Код проще, но проблема остается - в некоторых случаях кнопка возврата исчезает. Между прочим, я предполагаю, что это связано с тем, что я получил предупреждение. Кажется, это происходит только после возвращения из поездки через UIImagePicker, так что, возможно, что-то там происходит, чтобы что-то изменить. Кроме того, я включил NSZombies, и, очевидно, отключение этого параметра значительно меняет цвет лица.

1 Ответ

0 голосов
/ 23 августа 2010

Почему бы не переопределить drawRect в вашей категории UINavigationBar, а не drawLayer: inContext:?

Насколько я помню, это довольно чистый взлом, и нет необходимости предоставлять пользовательскую UILabel для вашего заголовка.

Обновление: ваша информация о предупреждении памяти имеет больше смысла. Вы настраиваете пользовательскую кнопку возврата? Когда контроллер получает предупреждение о памяти, он отказывается от просмотра, если его нет на экране. Есть очень хороший шанс, что это происходит с вашим навигационным контроллером. Если вы настраиваете пользовательскую кнопку «Назад», скажем, в методе init, ее нельзя будет повторно добавить к очистке предупреждения после записи в элементе навигации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...