it-swarm.com.de

benutzerdefinierten Titel in UINavigationBar zentrieren?

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:

Picture of title off ceter

Beachten Sie, wie der Titel verschoben wird, um den Knopf unterzubringen ....

16
itgiawa

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;
40
Bocaxica

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;
5
BHuelse

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)];
3
Luke

Ich habe Autolayout-Einschränkungen verwendet, um dieses Problem zu lösen:

  1. Fügen Sie UILabel zu einer UIView hinzu.
  2. 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];

  3. 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; }

  4. setzen Sie UIView auf navigationItem titleView

2
Yang Young

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
1

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
1
Unit Testing

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
    }
}
0
CedricSoubrie