A livello di programmazione cambiare l’altezza della barra di navigazione in swift

Voglio fare un più alto la barra di navigazione e sto cercando di fare questo, utilizzare una sottoclasse di UINavigationBar.

Qui è il mio sottoclasse di UINavigationBar:

import UIKit
class TallerNaviBar: UINavigationBar {
    override func sizeThatFits(size: CGSize) -> CGSize {
        var newSize:CGSize = CGSizeMake(size.width, 87)
        return newSize
    }
}

E nel mio ViewController che è incorporato in un controller di navigazione, scrivo il seguente codice nel viewDidLoad() funzione

self.navigationController!.setValue(TallerNaviBar(frame: CGRectMake(0, 0, self.view.frame.size.width, 87)), forKeyPath: "navigationBar")

C’è nessun errore segnalato, ma non ottengo nulla, quando ho eseguito il codice. Completamente vuoto di vista. A livello di programmazione cambiare l'altezza della barra di navigazione in swift.

Qualche suggerimento? O qualche altro modo per cambiare l’altezza? Grazie.

c’è la risposta rapida, nizza voto, sei il benvenuto
Grazie per la tua risposta. Ma la mia reputazione punto è solo 8, il che significa che non sono ammessi al voto si / no. Mi dispiace per il voto che hai, ma non è me.
così, la risposta c’è la risposta giusta, quella con l’ : self.superview!.fotogramma.la dimensione.larghezza, 87) provalo, e vedrai che dovrebbe funzionare bene, tipo il cast del viewcontroller, se si sa come fare questo in Swift, ci scusiamo per il pregiudizio
E io non posso dare un voto positivo o o recuperare la sua perdita. Il minimo per dare un voto positivo è 15 e il minimo per il voto è 125. stackoverflow.com/help/privileges/vote-up. stackoverflow.com/help/privileges/vote-down
vi sono buone per andare, non ti preoccupare, io sono l’altro tipo di fusione che potrebbe funzionare,

OriginaleL’autore Aiden | 2015-08-14

2 Replies
  1. 8
    class TallerNaviBar: UINavigationBar {
        override func sizeThatFits(size: CGSize) -> CGSize {
            var newSize:CGSize = CGSizeMake(self.superview!.frame.size.width, 87)
            return newSize
        }
    }

    Non faccio swift, ma la risposta è facile, ecco ObjC

    - (CGSize)sizeThatFits:(CGSize)size {
    
             return CGSizeMake([self superview].frame.size.width, 40);
    
    }

    Ecco la mia interpretazione in Swift:

    import UIKit
    class TallerNaviBar: UINavigationBar {
        override func sizeThatFits(size: CGSize) -> CGSize {
            var newSize:CGSize = CGSizeMake(superview.width, 87)
            return newSize
        }
    }

    Il problema, è necessario non è con questo metodo, questa è la parte facile, il problema è forzare il controller di navigazione di usare sempre questa barra di navigazione

    Ho sottoclasse e ridimensionare il tutto in IOS, tra cui la navigazione controller e tabbarcontrollers, per imporre che tutti i controller di navigazione utilizzare questa barra di navigazione, è necessario creare una sottoclasse di un navigationController e utilizzare solo questo navigationcontroller tutta la tua app, ecco come sottoclasse funziona, questo è Obj C, quindi dovrete tradurre:

    @interface NSHNavigationController () <UINavigationBarDelegate, UINavigationControllerDelegate>
    {
    
    }
    
    @implementation NSHNavigationController
    
    #pragma mark Initialization
    
    - (id)initWithCoder:(NSCoder *)aDecoder
    {
        self = [super initWithCoder:aDecoder];
        if (self) {
            [self NSHSetupNavigationController];
        }
        return self;
    }
    
    - (instancetype)initWithNavigationBarClass:(Class)navigationBarClass toolbarClass:(Class)toolbarClass
    {
        self = [super initWithNavigationBarClass:navigationBarClass toolbarClass:toolbarClass];
        if (self) {
            [self NSHSetupNavigationController];
        }
        return self;
    }
    
    - (id)initWithRootViewController:(UIViewController *)rootViewController
    {
        self = [super initWithRootViewController:rootViewController];
        if (self) {
            [self NSHSetupNavigationController];
        }
        return self;
    }
    
    - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
    {
        self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
        if (self) {
            [self NSHSetupNavigationController];
        }
        return self;
    }
    
    - (void)dealloc
    {
        [self setInternalDelegate:nil];
        [self setExternalDelegate:nil];
    }
    
    #pragma mark Setup
    
    - (void)NSHSetupNavigationController
    {
        [self setValue:[[NSHNavigationBar alloc]init] forKeyPath:@"navigationBar"];
    }

    questa è la linea che farà per voi:

       [self setValue:[[NSHNavigationBar alloc]init] forKeyPath:@"navigationBar"];

    Oh sì, e assicurarsi che si sono sottoclassi della nav bar, ha detto di essere stato, ma ecco come fare, è semplice:

    #import "NSHNavigationBar.h"
    
    @implementation NSHNavigationBar
    - (id)initWithFrame:(CGRect)frame {
        self = [super initWithFrame:frame];
        if (self) {
            NSDictionary *attributes = @{NSForegroundColorAttributeName:[UIColor whiteColor],
                                         NSFontAttributeName:fontMagicForRegularNSHFont};
            [self setTitleTextAttributes:attributes];
            [self setTranslucent:true];
            [self setBackgroundColor:[UIColor clearColor]];
        }
        return self;
    }
    - (CGSize)sizeThatFits:(CGSize)size {
    
        return CGSizeMake([self superview].frame.size.width, heightResizer(40));
    
    }
    
    - (void)layoutSubviews {
    
        [super layoutSubviews];
    
    }

    Così, in sintesi, sottoclasse sia il UINavigationBar e il UINavigationController e sei a posto, questo vi permetterà di manipolare la barra di navigazione ogni volta che si desidera, è anche possibile digitare il cast vostro punto di vista del controller di barre di navigazione, questo è un po ‘ di dadi e confondere un sacco di gente, ma qui si va:

    -(CustomNavigationBar *)navBar {
    
        return (id)[self.navigationController navigationBar];
    }

    mettere la roba di cui sopra, a vostro parere, controller e poi si chiama come questo:

    [[self navBar] setBackGroundColor:[UIColor blueColor]];

    Questo successo typecast il navigationcontroller essere la vostra barra di navigazione personalizzata, se si desidera modificare l’altezza della barra di navigazione da qui, allora si può fare qualcosa di simile a questo:

    Non funziona su iOS 11. Ho creato sottoclasse di UINavigationController e UINavigationBar come descritto sopra. In storyboard, ha cambiato i nomi di classe di UINavigationController e UINavigationBar ai rispettivi sottoclasse nomi. Ma l’altezza non cambia.

    OriginaleL’autore Loxx

  2. 8

    Qui è un semplice Swift 3 soluzione basata su minimo la creazione di sottoclassi. Prima sottoclasse UINavigationBar.:

    class CustomNavigationBar: UINavigationBar {
        override func sizeThatFits(_ size: CGSize) -> CGSize {
            let newSize :CGSize = CGSize(width: self.frame.size.width, height: 54)
            return newSize
        }
    }

    Creare il controller di navigazione in codice e utilizzare l’inizializzatore che prende la vostra barra di navigazione personalizzata di classe.

    let nav = UINavigationController(navigationBarClass: CustomNavigationBar.self, 
                                     toolbarClass: nil)

    Tutti il comportamento esistente per UINavigationBar è conservato e la tua altezza personalizzata è adottato.

    Come impostare la barra di navigazione personalizzata di classe all’interno UIStoryboard? Ho provato a cambiare il nome della classe, ma non funziona.
    sizeThatFits non è più supportato in ios11

    OriginaleL’autore Jaymassena

Lascia un commento