Ich habe einen benutzerdefinierten UINavigationBar-Titel und eine benutzerdefinierte Schaltfläche "Zurück". Mein Problem ist, dass der Titel nicht auf dem iPhone zentriert ist. Es ist, als ob mein Zurück-Button den Titel nach rechts drückt. Irgendeine Idee, wie ich es zentrieren kann?
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;
Vielen Dank!
edit Ich habe überflüssigen Code entfernt und dieses Bild hinzugefügt:
Beachten Sie, wie der Titel verschoben wird, um den Knopf unterzubringen ....
iOS macht dies, weil der Frame, den Sie initialisieren, immer mehr als 300 Pixel in der Breite ist. Es wird versucht, den Vollbildrahmen zu zentrieren, der Rahmen ist größer als der Platz, in den er eingefügt werden soll (aufgrund der Schaltfläche), und das Etikett wird daher nach rechts gedrückt. Was Sie tun müssen, ist zu geben Der Rahmen des navLabels ist so klein wie nötig.
Wenn Ihr Text also nur 100px breit ist, der Frame jedoch 400px ist, versucht iOS, die 400px im Navigationsheader zu zentrieren, und hat nicht genügend Platz. Wenn Sie die Größe auf die tatsächlich benötigten 100px setzen, zentriert iOS Ihre Kopfzeile richtig, da 100px genügend Platz für die Zentrierung bietet.
Das folgende Codefragment hilft Ihnen dabei, die Mindestgröße zu ermitteln, die Ihr Rahmen benötigt, abhängig von der Schriftart und dem Text, den Sie einzufügen versuchen. Stellen Sie sicher, dass der Rahmen des Etiketts so klein wie möglich ist, aber nicht überschreiten Sie die maximale Breite. (die Breite der Navigationsleiste).
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;
Ich hatte vorher das gleiche Problem. Ich hatte eine UINavigationbar
mit Rechts- und Links-Taste. Ich möchte ein Bild auf der UINavigationbar
zentrieren. Also musste ich das Bild mit UIView
in eine width
setzen. Das Bild selbst erhält einen x-Wert, der die Hälfte der eigenen width
ist.
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;
Gute Antwort! SizeWithFont ist jetzt jedoch veraltet. Sie möchten jetzt so etwas tun.
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)];
Ich habe Autolayout-Einschränkungen verwendet, um dieses Problem zu lösen:
Festlegen von Einschränkungen von centerX für das UILabel:
self.titleLabelCenterXConstraint = [NSLayoutConstraint constraintWithItem:self.titleLabel attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeCenterX multiplier:1.0f constant:0.0f];
Im UIView layoutSubViews können Sie den centerX-Versatzwert anpassen:
- (void)layoutSubviews
{
[super layoutSubviews];
CGFloat screenCenter = CGRectGetMidX([UIScreen mainScreen].bounds);
CGFloat diffCenter = screenCenter - CGRectGetMidX(self.frame);
self.titleLabelCenterXConstraint.constant = diffCenter;
}
setzen Sie UIView auf navigationItem titleView
Swift 3 für @ BHuelse's Antwort:
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
Schnell 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
Der Titel ist nicht in der Navigationsleiste zentriert. Sie ist zwischen den linken und den rechten Tasten der Navigationsleiste zentriert. Das bedeutet, wenn Sie links einen großen Knopf haben, wird der Titel nach rechts verschoben.
Sie können die Mitte ändern, indem Sie Ihrem Titel eine zentrierte Einschränkung hinzufügen und diese dann so ändern, dass sie wirklich die Mitte der Navigationsleiste ist:
// 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
}
}