Я использую 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];
}
Снимки экрана:
Какая-либо идея, почему это происходит?Спасибо.
Спасибо 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];
}
Одушевлен ли он? Он может анимировать представление заголовка, как будто оно переходит в новое представление. Я не вижу ничего плохого в том, как написано в вашем коде.
Я бы предложил в вашем displayComposerSheet просто отменить настройку titleView или анимировать альфа-канал titleView в 0.0. Затем анимируйте его обратно в 1.0 при закрытии модального контроллера представления. Не идеально, но так может выглядеть лучше.
Честно говоря, вся система UINavigation - это дерьмо. Мы пошли дальше и переписыли его из-за таких странных проблем.
Единственная проблема - это размер вашей рамки, поэтому вам придется его изменить.
Попробуйте вот это.
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;
Я изучил проблему с некоторым обращением и попытался найти следующие факты:
В сценарии, где установлен 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;
Теперь все хорошо. нямммм.