2012-03-29 13 views
16

Ho un titolo personalizzato UINavigationBar e un pulsante Indietro personalizzato. Il mio problema è che il titolo non è centrato su iPhone. È come se il mio pulsante posteriore spingesse il titolo verso destra. Qualche idea su come posso centrarla?centro titolo personalizzato in UINavigationBar?

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; 

Grazie!

modificare ho rimosso il codice superfluo e ha aggiunto questa immagine:

Picture of title off ceter

Si noti come il titolo è spinto oltre per accogliere il pulsante ....

+0

Sembra essere un problema di diff. Il mio titolo è centrato verticalmente correttamente. Non è centrato orizzontalmente correttamente (il pulsante lo sposta sopra). Se rimuovo il pulsante, tutto è centrato perfettamente ... – itgiawa

risposta

40

iOS sta facendo questo perché la il frame che si inizializza è sempre di 300 + pixel di larghezza. Sta cercando di centrare il fotogramma intero, la cornice è più grande dello spazio in cui vuole inserirla (a causa del pulsante) e quindi l'etichetta viene spinta a destra. Quello che devi fare è dare al Frame di navLabel la dimensione minima di cui ha bisogno.

Quindi se il testo è largo solo 100 px, ma il frame è 400 px, quindi iOS sta cercando di centrare il 400 px all'interno dell'intestazione di Navigazione e non ha spazio sufficiente. Quando imposti la dimensione sul 100px effettivo necessario, iOS centrerà correttamente l'intestazione, perché c'è molto spazio per centrare 100px.

Il frammento di codice qui sotto dovrebbe aiutare a rilevare la dimensione minima vostre esigenze del telaio, a seconda del tipo di carattere e il testo si tenta di mettere in. Assicurarsi che il telaio del marchio è il più piccolo possibile, ma non lo fa superare la larghezza massima. (la larghezza della barra di navigazione).

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; 
+1

Nota in iOS 6 e versioni successive UITextAlignmentCenter è stato dichiarato obsoleto. Puoi invece utilizzare NSTextAlignmentCenter. – user885232

+0

Grazie, ho aggiornato questo nella risposta – Bocaxica

+0

self.navigationItem.titleView - perfect! – gbk

3

Bella risposta! Tuttavia sizeWithFont è ora deprecato. Vorresti fare qualcosa del genere ora.

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)]; 
5

Ho avuto lo stesso problema prima. Ho avuto un UINavigationbar con il tasto destro e sinistro. Voglio centrare un'immagine sullo UINavigationbar. Quindi ho dovuto inserire l'immagine in UIView con width 0. L'immagine auto ottiene un valore x che è la metà del proprio 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; 
+0

Sorpreso, questo funziona, ma ha funzionato bene per me. Trucco interessante per sapere di essere in grado di "nascondere" una vista all'interno di una vista di larghezza zero. – anorskdev

2

ho usato vincoli layout automatico per risolvere questo problema:

  1. Aggiungi UILabel in un UIView.
  2. Set vincoli centerX per l'UILabel:

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

  3. Nella UIView layoutSubviews per regolare il centerX valore di offset:

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

  4. set UIView al navigationItem titleView

+0

Provato. Non ha funzionato. Il titolo non si muoveva. L'offset è stato calcolato correttamente, come sembra. – osxdirk

+0

potresti condividere il tuo codice? –

+1

Funziona come un fascino! – odm

1

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

Il titolo non è centrato nella barra di navigazione stessa. È centrato tra i pulsanti sinistro e destro della barra di navigazione. Ciò significa che se hai un grosso pulsante a sinistra, il titolo verrà spostato a destra.

È possibile modificare il centro con l'aggiunta di un vincolo centrato per il titolo e poi modificarlo in modo che sia veramente il centro della barra di navigazione:

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

Swift 3 per @ di BHuelse risposta:

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 
Problemi correlati