Затухание заголовка контроллера навигации в / из - PullRequest
1 голос
/ 07 марта 2011

Я установил заголовок моего контроллера навигации с помощью свойства title. Мне бы хотелось, чтобы заголовок мог появляться и исчезать в ответ на некоторые действия пользователя.

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

Поэтому я ищу альтернативное решение. Есть ли другой способ затухания заголовка контроллера навигации без использования пользовательского представления заголовка?

РЕДАКТИРОВАТЬ : я получил несколько ответов, показывающих, как это сделать, добавив подпредставления. Несмотря на то, что это позволяет использовать функцию постепенного исчезновения / входа, я хотел бы избегать использования подпредставлений, поскольку столкнулся с проблемой при реализации этого решения.

Есть ли что-то встроенное в объекты навигации, позволяющее исчезновение заголовка? Я уже провел некоторое исследование, и пока оцениваю ответы, я полагаю, что нет. Я просто пишу в качестве последнего средства, только если кто-нибудь знает способ.

Ответы [ 4 ]

1 голос
/ 08 января 2014

Согласен с комментарием @ImaginaryCake: настройка свойства title звучит как хак . Правильный способ - использовать titleView вместо итерации по UINavitationBar -subviews и надеяться, что он выдержит обновления SDK.

Быстрая и чистая всего за 2 шага; Из UIViewController выполните:

Шаг 1 : измените titleView на свой navigationItem.

self.navigationItem.titleView = ({
    UILabel * titleView = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 20)];
    [titleView setTextAlignment:NSTextAlignmentCenter];
    [titleView setText:@"HeyHey"];

    titleView;
});

Шаг 2 : анимация по желанию.

[UIView animateWithDuration:1.0f animations:^{
    self.navigationItem.titleView.alpha = 0.5f;
}];
1 голос
/ 07 марта 2011

Это может быть полезно для вас ....

fade.h

#import <UIKit/UIKit.h>

@interface RootViewController : UIViewController
 {

     UINavigationBar *navigationbar;

     NSTimer * timer;
     UILabel * ll;
      UILabel * l2;
 }

@property(nonatomic,retain) UINavigationBar *navigationbar;


@end

fade.m

#define FADE_IN_RATE        2.0/100.0
#define FADE_OUT_RATE       2.0/200.0
- (void)viewDidLoad {   
    [super viewDidLoad];
    ll.alpha = 0.0;
    l2.alpha =1.0;
    ll = [[UILabel alloc]init];
    l2 = [[UILabel alloc]init];
    l2.backgroundColor = [UIColor grayColor];
    ll.text = @"Name";
    ll.backgroundColor = [UIColor grayColor];
    ll.frame = CGRectMake(115, 10, 60, 20);
    l2.frame = CGRectMake(115, 10, 60, 20);
    [self.navigationController.navigationBar addSubview:ll];
    [self.navigationController.navigationBar addSubview:l2];
    self.navigationController.navigationBar.tintColor = [UIColor grayColor];
    timer = [NSTimer scheduledTimerWithTimeInterval:0.0 target:self selector:@selector(fadeScreen) userInfo:nil repeats:NO];
}
- (void)fadeScreen
{

    timer = [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(fadeTimerEvent) userInfo:nil repeats:YES];


}

- (void)fadeTimerEvent
{

    if (ll.alpha >= 2)
    {
                // At this point, layer1 is now visible  
        [timer invalidate];
        timer = nil;    

    }
    else
    { 

        // Fade lower layer in (increase alpha)
         ll.alpha += FADE_IN_RATE;

        // Fade upper layer out (decrease alpha)
          l2.alpha -= FADE_OUT_RATE;
    }
}

С уважением, CNSivakumar

0 голосов
/ 07 марта 2011

title свойство UIViewController это просто NSString.Вам необходимо добавить свой пользовательский вид в панель навигации.

title

Локализованная строка, представляющая представление, которым управляет этот контроллер.

@ property (nonatomic,copy) NSString * title

Обсуждение

Подклассы должны установить заголовок в удобочитаемую строку, которая представляет представление для пользователя.Если получателем является контроллер навигации, значением по умолчанию является заголовок контроллера верхнего вида.

0 голосов
/ 07 марта 2011

Быстро и грязно: вы сможете добавить пользовательскую метку на панель навигации с помощью

[navigationBar addSubview:yourLabel];

Просто установите рамку метки так, чтобы она находилась по центру на панели навигации, и измените ее альфа-значение, как вы это сделалидо.Тем не менее, это настоящий взлом, и я не уверен, как он себя ведет, когда вы нажимаете и выталкиваете контроллеры представления.

РЕДАКТИРОВАТЬ:

Хорошо, вот и все.Сначала предположим, что у нас есть панель навигации, содержащая элемент навигации со свойством title (не свойство titleView), а также набор элементов кнопок левой и правой панели.

UINavigationBar* bar = [[UINavigationBar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];
[self.view addSubview:bar];

UINavigationItem* anItem = [[UINavigationItem alloc] initWithTitle:@"HeyHey"];
UIBarButtonItem* leftItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:nil action:nil];
UIBarButtonItem* rightItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:nil action:nil];
anItem.leftBarButtonItem = leftItem;
anItem.rightBarButtonItem = rightItem;
bar.items = [NSArray arrayWithObject:anItem];
[leftItem release];
[rightItem release];
[anItem release];

Теперь выможет исчезнуть вид заголовка следующим образом:

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:1];
[[[bar subviews] objectAtIndex:0] setAlpha:0];
[UIView commitAnimations];

Я не знаю, всегда ли вид заголовка имеет индекс 0, но вы можете проверить свой конкретный случай, используя

for (UIView* aView in bar.subviews) {
    NSLog(@"%@", aView);
}

Для заголовка вы увидите что-то вроде

<UINavigationItemView: 0x7566530; frame = (0 0; 0 0); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x75665e0>>
...