центр пользовательского заголовка в UINavigationBar? - PullRequest
16 голосов
/ 29 марта 2012

У меня есть пользовательский заголовок UINavigationBar и пользовательская кнопка возврата. Моя проблема в том, что название не сосредоточено на iPhone. Как будто моя кнопка «назад» толкает заголовок вправо. Любая идея, как я могу это отцентрировать?

int height = self.navigationController.navigationBar.frame.size.height;
int width = self.navigationController.navigationBar.frame.size.width;


UILabel *navLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, width + 300, 20)];
navLabel.backgroundColor = [UIColor whiteColor];
navLabel.textColor = [UIColor redColor];
navLabel.font = [UIFont fontWithName:@"Helvetica" size:30];
navLabel.textAlignment = UITextAlignmentCenter;
self.navigationItem.titleView = navLabel;
[navLabel release];
((UILabel *)self.navigationItem.titleView).text = self.title;

Спасибо! * * 1004

edit Я удалил лишний код и добавил эту картинку:

Picture of title off ceter

Обратите внимание, как заголовок перемещается, чтобы разместить кнопку ....

Ответы [ 7 ]

40 голосов
/ 10 апреля 2012

iOS делает это, потому что инициализируемый вами кадр всегда имеет ширину 300+ пикселей.Он пытается центрировать полный кадр, кадр больше, чем пространство, в которое он хочет поместиться (из-за кнопки), и поэтому ваша метка сдвигается вправо.То, что вам нужно сделать, это дать фрейму navLabel минимальный необходимый размер.

Так что если ваш текст имеет ширину всего 100 пикселей, а фрейм 400 пикселей, то iOS пытается центрировать 400 пикселей внутри Навигациизаголовок, и не хватает места.Когда вы установите нужный фактический размер 100px, iOS будет правильно центрировать ваш заголовок, потому что есть достаточно места для центрирования 100px.

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

UIFont* titleFont = [UIFont fontWithName:@"Helvetica" size:30];
CGSize requestedTitleSize = [titleText sizeWithAttributes:@{NSFontAttributeName: titleFont}]; 
CGFloat titleWidth = MIN(maxTitleWidth, requestedTitleSize.width);

UILabel *navLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, titleWidth, 20)];
navLabel.backgroundColor = [UIColor whiteColor];
navLabel.textColor = [UIColor redColor];
navLabel.font = [UIFont fontWithName:@"Helvetica" size:30];
navLabel.textAlignment = NSTextAlignmentCenter;
navLabel.text = titleText;
self.navigationItem.titleView = navLabel;
5 голосов
/ 11 июня 2015

У меня была такая же проблема раньше. У меня был UINavigationbar с правой и левой кнопкой. Я хочу центрировать изображение на UINavigationbar. Поэтому мне пришлось поместить изображение в UIView с width 0. Изображение self получает значение x, равное половине собственного width.

UINavigationItem *item = navigationController.topViewController.navigationItem;
UIView *backView =[[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 30)];
[img_logo setFrame:CGRectMake(-45, 5, 90, 20)];
[backView addSubview:img_logo];
item.titleView = backView;
3 голосов
/ 15 февраля 2015

Хороший ответ!Однако sizeWithFont устарела.Вы хотели бы сделать что-то вроде этого сейчас.

NSDictionary *textTitleOptions = [NSDictionary dictionaryWithObjectsAndKeys:  [UIFont fontWithName:@"Helvetica" size:30], NSFontAttributeName, nil];

CGSize requestedTitleSize = [[NSString stringWithFormat:@"Your String"] sizeWithAttributes:textTitleOptions];

CGFloat titleWidth = MIN(self.view.frame.size.width, requestedTitleSize.width);

UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, titleWidth, 44)];
2 голосов
/ 21 июня 2016

Я использовал ограничения автопоставки для решения этой проблемы:

  1. Добавление UILabel в UIView.
  2. Установка ограничений centerX для UILabel:

    self.titleLabelCenterXConstraint = [NSLayoutConstraint constraintWithItem:self.titleLabel attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeCenterX multiplier:1.0f constant:0.0f];

  3. В UView ViewSubViews настроить значение смещения centerX:

    - (void)layoutSubviews { [super layoutSubviews]; CGFloat screenCenter = CGRectGetMidX([UIScreen mainScreen].bounds); CGFloat diffCenter = screenCenter - CGRectGetMidX(self.frame); self.titleLabelCenterXConstraint.constant = diffCenter; }

  4. установить UIView внавигацияItem titleView

1 голос
/ 21 сентября 2017

Swift 3 для ответа @ BHuelse:

let image = UIImage(named: "logo")
let logoView = UIView.init(frame: CGRect(x: 0, y: 0, width: 0, height: 30))
let imageView = UIImageView(frame: CGRect(x: -45, y: 5, width: 90, height: 20))
imageView.image = image
imageView.contentMode = .scaleAspectFit
logoView.addSubview(imageView)
self.navigationItem.titleView = logoView
1 голос
/ 16 ноября 2016

Swift 2.3:

    let tlabel = UILabel(frame: CGRectMake(0, 0, 200, 40))
    tlabel.text = self.title
    tlabel.textColor = UIColor.whiteColor()
    tlabel.font = UIFont.boldSystemFontOfSize(17) //UIFont(name: "Helvetica", size: 17.0)
    tlabel.backgroundColor = UIColor.clearColor()
    tlabel.adjustsFontSizeToFitWidth = true
    tlabel.textAlignment = .Center
    self.navigationItem.titleView = tlabel
0 голосов
/ 29 июня 2017

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

Вы можете изменить центр, добавив центрированное ограничение к заголовку, а затем изменив его так, чтобы он действительно был центромпанели навигации:

// Position the title in the middle of the navbar and not in the middle of buttons
fileprivate func centerTitle () {
    if let navigation = self.navigationController {
        let titleMiddle = navigation.navigationBar.convert(titleViewLabel.frame, from: titleViewLabel.superview).midX
        let diff = navigation.navigationBar.center.x - titleMiddle
        constraintTitleViewCentered.constant += diff
    }
}
...