Центр в UINavigationBar? - программирование
Подтвердить что ты не робот

Центр в UINavigationBar?

У меня есть пользовательский заголовок 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;

Спасибо!

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

Picture of title off ceter

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

4b9b3361

Ответ 1

iOS делает это, потому что кадр, который вы инициализируете, всегда 300 + ширина пикселей. Он пытается центрировать полный кадр, кадр больше пространства, в котором он хочет поместиться (из-за кнопки), и поэтому ваш ярлык попадает вправо. Что вам нужно сделать, так это предоставить Frame 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;

Ответ 2

Раньше у меня была такая же проблема. У меня был 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

Хороший ответ! Однако 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)];

Ответ 4

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

  • Добавить UILabel в UIView.
  • Задайте ограничения для центра X для UILabel:

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

  • В UIView layoutSubViews для настройки значения смещения центра X:

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

  • установить UIView в navigationItem titleView

Ответ 5

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

Ответ 6

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

Ответ 7

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

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

// 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
    }
}