ios como - Cambia la altura de la barra de navegación de forma programática en forma rápida





un pildorasinformaticas (3)


Aquí hay una solución simple de Swift 3 basada en subclases mínimos. Primera subclase UINavigationBar .:

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

Cree el controlador de navegación en código y use el inicializador que toma su clase de barra de navegación personalizada.

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

Se conserva todo el comportamiento existente para UINavigationBar y se adopta su altura personalizada.

Quiero hacer una barra de navegación más alta y estoy tratando de hacer esto usando una subclase de UINavigationBar.

Aquí está mi subclase de UINavigationBar:

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

Y en mi ViewController que está incrustado en un controlador de navegación, escribo el siguiente código en la función viewDidLoad ()

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

No se informa ningún error, pero no obtengo nada cuando ejecuto el código. Una vista completamente en blanco. .

¿Cualquier sugerencia? ¿O alguna otra forma de cambiar la altura? Gracias.




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

No lo hago rápido, pero la respuesta es fácil, aquí está ObjC

- (CGSize)sizeThatFits:(CGSize)size {

         return CGSizeMake([self superview].frame.size.width, 40);

}

Aquí está mi interpretación en Swift:

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

El problema que tendrá no es con este método, esta es la parte fácil, el problema está forzando al controlador de navegación a usar siempre esta barra de navegación

Subclaso y cambio el tamaño de todo en IOS, incluidos los controladores de navegación y tabbarcontrollers, para asegurar que todos los controladores de navegación usen esta barra de navegación, debes subclasificar un navigationController y solo usar este control de navegación en tu aplicación, así es como funciona la subclase, esto es Obj C, así que tendrás que traducirlo:

@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"];
}

esta es la línea que lo hará por usted:

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

Oh sí, y asegúrate de estar subclasando la barra de navegación, dijiste que sí, pero así es como lo haces, es simple:

#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];

}

Entonces, en resumen, la subclase UINavigationBar y UINavigationController y usted está configurado, esto le permitirá manipular la barra de navegación siempre que lo desee, también puede escribir lanzar las barras de navegación de su controlador de vista, esto es un poco loco y lo hará confundir a mucha gente, pero aquí va:

-(CustomNavigationBar *)navBar {

    return (id)[self.navigationController navigationBar];
}

pon las cosas de arriba en tu controlador de vista y luego llámalo así:

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

Esto convertirá tu controlador de navegación en una barra de navegación personalizada, si deseas cambiar la altura de la barra de navegación desde aquí, puedes hacer algo como esto:




iOS 10 Swift 3.0

Si no le importa usar marcos rápidos, entonces UINeraida para cambiar el fondo de navegación como UIColor o HexColor o UIImage y cambiar el texto del botón de retroceso de navegación mediante programación, cambie el color del texto forground completo.

Para UINavigationBar

    neraida.navigation.background.color.hexColor("54ad00", isTranslucent: false, viewController: self)

    //Change navigation title, backbutton colour

    neraida.navigation.foreground.color.uiColor(UIColor.white, viewController: self)

    //Change navigation back button title programmatically

    neraida.navigation.foreground.backButtonTitle("Custom Title", ViewController: self)

    //Apply Background Image to the UINavigationBar

    neraida.navigation.background.image("background", edge: (0,0,0,0), barMetrics: .default, isTranslucent: false, viewController: self)






ios swift uinavigationcontroller uinavigationbar