Позиция UINavigationItem titleView
Я использую свойство UINavigationItem titleView для установки пользовательского UILabel с желаемым размером/цветом шрифта. Здесь мой код:
self.headerLabel = [[UILabel alloc] initWithFrame:CGRectMake(0.0, 0.0, 400.0, 44.0)];
self.headerLabel.textAlignment = UITextAlignmentCenter;
self.headerLabel.backgroundColor = [UIColor clearColor];
self.headerLabel.font = [UIFont boldSystemFontOfSize:20.0];
self.headerLabel.textColor = [UIColor colorWithRed:0.259 green:0.280 blue:0.312 alpha:1.0];
self.navigationItem.titleView = self.headerLabel;
В навигационной панели у меня также есть кнопка на левом баре. В результате получится следующее:
alt text http://cl.ly/41164eec656c96e7c913/content
Как вы можете видеть, текст неправильно центрирован. Я пробовал установить x происхождение метки, но это не имеет никакого эффекта.
Ответы
Ответ 1
Если вы сделаете headerLabel подвью для titleView, вы можете установить кадр headerLabel для управления тем, где он находится в titleView.
Как вы это делаете сейчас, у вас нет такого контроля. Я думаю, что ОС выбирает рамку titleView для вас на основе доступного пространства.
Надеюсь, это поможет!
Ответ 2
Вместо initWithFrame
просто используйте init
и поместите [self.headerLabel sizeToFit]
после последней строки кода.
Ответ 3
Я использовал пользовательские метки заголовков для своих навигационных баров в каждом приложении, которое у меня есть в магазине приложений. Я тестировал много разных способов сделать это, и самым простым способом использования пользовательской метки в навигационной панели является полное игнорирование titleView
и вставка вашей метки непосредственно в navigationController.view
.
При таком подходе легко получить, чтобы рамка метки заголовка всегда соответствовала рамке navigationBar, даже если вы используете пользовательский navBar с нестандартным размером.
- (void)viewDidLoad {
[self.navigationController.view addSubview:self.titleLabel];
[super viewDidLoad];
}
- (BOOL)shouldAutorotateToInterfaceOrientation:
(UIInterfaceOrientation)interfaceOrientation {
return YES;
}
- (void)didRotateFromInterfaceOrientation:
(UIInterfaceOrientation)fromInterfaceOrientation {
[self frameTitleLabel];
}
- (UILabel *) titleLabel {
if (!titleLabel) {
titleLabel = [[UILabel alloc]
initWithFrame:self.navigationController.navigationBar.frame];
titleLabel.font = [UIFont fontWithName:@"Helvetica-Bold" size:18];
titleLabel.text = NSLocalizedString(@"Custom Title", nil);
titleLabel.textAlignment = UITextAlignmentCenter;
titleLabel.lineBreakMode = UILineBreakModeTailTruncation;
}
return titleLabel;
}
- (void) frameTitleLabel {
self.titleLabel.frame = self.navigationController.navigationBar.frame;
}
Один из подходов к этому подходу состоит в том, что ваш заголовок может перетекать поверх всех кнопок, которые у вас есть на navBar, если вы не внимательны и слишком долго заставляете заголовок. Но IMO, это гораздо менее проблематично, чем 1) Название не центрируется правильно, когда у вас есть rightBarButton или 2) Заголовок не появляется, если у вас есть leftBarButton.
Ответ 4
У меня такая же проблема; Я как-то решил эту проблему, вычислив длину заголовка и соответственно установив ширину рамки метки. Хотя это не идеальный вариант, но он может быть управляемым. Вот код.
label = [[UILabel alloc] init];
label.backgroundColor = [UIColor clearColor];
label.font = [ UIFont fontWithName: @"XXII DIRTY-ARMY" size: 32.0 ];
label.shadowColor = [UIColor colorWithWhite:0.0 alpha:0.0f];
label.textAlignment = UITextAlignmentCenter;
label.textColor =[UIColor orangeColor];
//label.text=categoryTitle;
CGFloat verticalOffset = 2;
NSString *reqSysVer = @"5.0";
NSString *currSysVer = [[UIDevice currentDevice] systemVersion];
if ([currSysVer compare:reqSysVer options:NSNumericSearch] != NSOrderedAscending)
{
if (categoryTitle.length > 8)
{
label.frame = CGRectMake(0, 0, 300, 44);
}else {
label.frame = CGRectMake(0, 0, 80, 44);
}
self.navigationItem.titleView = label;
self.navigationItem.title=label.text;
[[UINavigationBar appearance] setTitleVerticalPositionAdjustment:verticalOffset forBarMetrics:UIBarMetricsDefault];
[[UIBarButtonItem appearance] setTintColor:[UIColor newBrownLight]];
}
Ответ 5
Просто рассчитайте точный размер кадра и выровняйте его влево:
UIFont* font = [UIFont fontWithName:@"Bitsumishi" size:20];
CGSize maximumLabelSize = CGSizeMake(296,9999);
CGSize expectedLabelSize = [title sizeWithFont:font constrainedToSize:maximumLabelSize lineBreakMode:UILineBreakModeCharacterWrap];
CGRect frame = CGRectMake(0, 0, expectedLabelSize.width, expectedLabelSize.height);
UILabel *label = [[[UILabel alloc] initWithFrame:frame] autorelease];
label.font = font;
label.textAlignment = UITextAlignmentLeft;
label.text = title;
self.titleView = label;
Ответ 6
UIView *vw = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 40)];
UILabel *lbl = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 320, 40)];
lbl.text = @"Home";
lbl.textAlignment = UITextAlignmentCenter;
lbl.backgroundColor = [UIColor clearColor];
lbl.textColor = [UIColor whiteColor];
lbl.font = [UIFont fontWithName:@"HelveticaNeue-Bold" size:20];
lbl.shadowColor = [UIColor blackColor];
lbl.shadowOffset = CGSizeMake(0,1);
self.navigationItem.titleView = vw;
[self.navigationItem.titleView addSubview:lbl];
Ответ 7
Что для меня работало, так это обновить кадр titleView в методе viewDidAppear.
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
UIView *titleView = self.navigationItem.titleView;
CGRect navBarFrame = self.navigationController.navigationBar.frame;
[titleView setFrame:CGRectMake((CGRectGetWidth(navBarFrame) - TitleWidth) / 2, (CGRectGetHeight(navBarFrame) - TitleHeight) / 2, TitleWidth, TitleHeight)];
}