Почему navigationItem.titleView выравнивает по левому краю когда названный presentmodalviewcontroller?

Я использую UILabel для titleView панели навигации (я делаю простой веб-браузер в приложении). Это хорошо работает, за исключением того, что, когда я представляю модальный контроллер представления, сдвиги titleView от центра navbar к крайне левому (под кнопкой "Назад"). Я протестировал в 3,0 и. Вот соответствующие нормы:

- (void)viewDidLoad {
    [super viewDidLoad];
    // Title view label
    CGRect labelFrame = CGRectMake(0.0, 0.0, 120.0, 36.0); 
    UILabel *label = [[[UILabel alloc] initWithFrame:labelFrame] autorelease];
    label.font = [UIFont boldSystemFontOfSize:14];
    label.numberOfLines = 2;
    label.backgroundColor = [UIColor clearColor];
    label.textAlignment = UITextAlignmentCenter;
    label.textColor = [UIColor whiteColor];
    label.shadowColor = [UIColor blackColor];
    label.shadowOffset = CGSizeMake(0.0, -1.0);
    label.lineBreakMode = UILineBreakModeMiddleTruncation;
    self.navigationItem.titleView = label;
}

-(void)displayComposerSheet:(NSString*)mailto 
{
    MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init];
    picker.mailComposeDelegate = self;
    [self presentModalViewController:picker animated:YES];
    [picker release];
}

Снимки экрана: enter image description here

Какая-либо идея, почему это происходит?Спасибо.

6
задан codercat 20 January 2014 в 11:44
поделиться

4 ответа

Спасибо DougW за то, что указал мне в правильном направлении. Вот лучший хак, который я нашел. В основном я сохраняю UILabel как свойство класса. Перед представлением модального представления я отключил titleView, а затем сбросил его сразу после этого. Когда модальное представление закрывается, я снимаю настройку, а затем сбрасываю titleView. Для пользователя ничто из этого не заметно.

-(void)displayComposerSheet:(NSString*)mailto 
{
    self.navigationItem.titleView = nil;
    MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init];
    picker.mailComposeDelegate = self;
    picker.navigationBar.tintColor = [APPDELEGATE getNavTintColor];
    [picker setToRecipients:[NSArray arrayWithObject:mailto]];
    [self presentModalViewController:picker animated:YES];
    [picker release];
    self.navigationItem.titleView = titlelabel;
}

- (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error 
{   
    self.navigationItem.titleView = nil;
    self.navigationItem.titleView = titlelabel;
    [self dismissModalViewControllerAnimated:YES];
}
3
ответ дан 8 December 2019 в 17:18
поделиться

Одушевлен ли он? Он может анимировать представление заголовка, как будто оно переходит в новое представление. Я не вижу ничего плохого в том, как написано в вашем коде.

Я бы предложил в вашем displayComposerSheet просто отменить настройку titleView или анимировать альфа-канал titleView в 0.0. Затем анимируйте его обратно в 1.0 при закрытии модального контроллера представления. Не идеально, но так может выглядеть лучше.

Честно говоря, вся система UINavigation - это дерьмо. Мы пошли дальше и переписыли его из-за таких странных проблем.

1
ответ дан 8 December 2019 в 17:18
поделиться

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

Попробуйте вот это.

   UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0.0, 0.0, 320.0, 36.0)];

   label.font = [UIFont boldSystemFontOfSize:14];
   label.numberOfLines = 2;
   label.backgroundColor = [UIColor clearColor];
   label.textAlignment = UITextAlignmentCenter;
   label.textColor = [UIColor whiteColor];
   label.shadowColor = [UIColor blackColor];
   label.shadowOffset = CGSizeMake(0.0, -1.0);
   label.lineBreakMode = UILineBreakModeMiddleTruncation;
   label.text=@"Stack Overflow";  
   self.navigationItem.titleView = label;
1
ответ дан 8 December 2019 в 17:18
поделиться

Я изучил проблему с некоторым обращением и попытался найти следующие факты:

  • Если UINavigationBar не имеет rightBarButtonItem, titleView смещается вправо на ~ 30 пунктов.
  • Его можно было воспроизвести для leftBarButtonItem. Но я не пробовал.

В сценарии, где установлен titleView по умолчанию для UINavigationBar (без изменений в rightBarButtonItem по умолчанию). А затем новый UIView помещается в стек навигации, который ИМЕЕТ rightBarButtonItem. Теперь, если это представление всплывает [с кнопкой назад], панель навигации удаляет rightBarButtonItem. И это будет учитывать странное смещение, которое сдвигает titleView в сторону.

Я решил проблему так:

self.navigationItem.titleView = myCustomTitleView;

// Fake right button to align titleView properly.
UIBarButtonItem *rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:[[UIView alloc] initWithFrame:CGRectMake(0, 0, 50, 1)]];
// Width equivalent to system default Done button's (which appears on pushed view in my case).
rightBarButtonItem.enabled = NO;
self.navigationItem.rightBarButtonItem = rightBarButtonItem;

Теперь все хорошо. нямммм.

10
ответ дан 8 December 2019 в 17:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: