2010-09-13 3 views
8

Я, вероятно, что-то неправильно сделал, потому что это выглядит немного глупо.
Я настраиваю пользовательское titleView (в форме UILabel) на моем UINavigationController, которое одинаково на каждой странице. Чтобы облегчить это, я создал функцию в своем делегате приложения, чтобы правильно отобразить метку. Затем я вызываю эту функцию в любом подзаголовке сразу после того, как я нажимаю ее в стек навигации.
Вот код (который, вероятно, имеет больше смысла, чем мое объяснение):Пользовательское titleView на UINavigationController неправильно анимируется

//In MyAppDelegate.m: 
- (void)showTitleForNavigationController:(UINavigationController*) navController { 
    UILabel *label = [[UILabel alloc] init]; 
    // set up label attributes 
    // ... 
    [label sizeToFit]; //without this line my label won't show at all 
    [navController.navigationBar.topItem setTitleView:label]; 
    [label release]; 
} 

// In SomeViewController.m, when pushing another controller onto the stack: 
    UIViewController *otherViewController = //initialize other view controller; 
    [self.navigationController pushViewController:otherViewController animated:YES]; 
    [(MyAppDelegate*)[[UIApplication sharedApplication] delegate] showTitleForNavigationController:otherViewController.navigationController]; 

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

ответ

0

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

3

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

В моем случае я устанавливаю пользовательский UILabel как заголовок, и я понял, что только когда я устанавливаю свойство titleview в методе viewDidLoad, он анимируется правильно. Однако в некоторых случаях я еще не знал название в моем представленииDidLoad (в некоторых случаях мне нужно было использовать заголовок из HTTP-запроса, например). Итак, мое решение для этих случаев состояло в том, чтобы установить свойство titleview в мою собственную метку с текстом @ "" в viewDidLoad, и всякий раз, когда я получил реальный заголовок, я только изменил свойство text моей пользовательской метки.

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view from its nib. 

    //set temporary title, the MBMUINavigationBarTitleView is a UIView subclass whose viewWithTitle method returns an autoreleased UIlabel with my custom settings, custom font etc. 
    self.navigationItem.titleView = [MBMUINavigationBarTitleView viewWithTitle:@" "]; 
} 

//somewhere later, when I have the real title 
UILabel* titleLabel = (UILabel*)self.navigationItem.titleView; 
[titleLabel setText:theRealTitle]; 
+0

Имеет ли размер titleLabel сам размер? – leftspin

+0

Если я правильно помню, у меня была функция, которая изменяла размер метки при изменении текста. – ylva

0

Я был в аналогичной ситуации Ильва, используя экземпляр пользовательского текстового класса для свойства UINavigationItem'stitleView. Тем не менее, я нашел, что настройка его в viewDidLoad не разрешила сбой в анимации.

Мое решение проблемы состояло в том, чтобы дождаться, пока контрольный контроллер зрения не будет удален из стека контроллера навигации, и в этот момент удалите UINavigationItem's пользовательский , чтобы он никогда не нуждался в анимации вообще.

Когда мой UINavigationController суб-класс получает popViewControllerAnimated: сообщения, скопировать текст заголовка из моего пользовательских текстового поля (UINavigationItem'stitleView) в собственность UINavigationItem'stitle и установить titleView свойства ноль. Затем UINavigationController идет вперед и выталкивает контроллер вида, и только стандартная метка заголовка панели навигации анимируется (а не мой пользовательский заголовок), без сбоев.