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;