Почему navigationItem.titleView выравнивается по левому краю, когда вызывается presentmodalviewcontroller? - PullRequest
6 голосов
/ 03 июня 2010

Я использую UILabel для titleView панели навигации (я делаю простой в приложении веб-браузер). Он работает нормально, за исключением того, что, когда я представляю контроллер модального представления, titleView смещается от центра навигационной панели в крайнее левое положение (под кнопкой возврата). Я тестировал в 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

Есть идеи, почему это происходит? Спасибо.

Ответы [ 7 ]

10 голосов
/ 05 августа 2010

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

  • Если 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;

Теперь все сладко. yummmm.

3 голосов
/ 04 июня 2010

Спасибо 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];
}
1 голос
/ 03 июня 2010

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

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

   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 голос
/ 03 июня 2010

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

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

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

0 голосов
/ 18 марта 2018

Если вы измените размер ширины на маленький, например, 100 точек или меньше вместо 120, то эта проблема может исчезнуть. Установка ширины метки поменьше сработала у меня.

0 голосов
/ 22 мая 2017

Вы можете попробовать переместить код в viewDidAppear:

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    // You code to customize title view
    self.navigationItem.titleView = logoImage;
}

У меня это работает.

0 голосов
/ 27 августа 2014
  UIView *view=    [[UIView alloc] initWithFrame:CGRectMake(0, 0, 40, 40)];
  [view setUserInteractionEnabled:NO];
  view.backgroundColor=[UIColor colorWithPatternImage:[UIImage imageNamed:@"logo_small.png"]];
  UIBarButtonItem *barButton=[[UIBarButtonItem alloc]initWithCustomView:view ];
  self.navigationItem.leftBarButtonItem = barButton;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...