Программно изменить высоту панели навигации в Swift

ios swift uinavigationcontroller uinavigationbar

13017 просмотра

2 ответа

48 Репутация автора

Я хочу сделать более высокую панель навигации, и я пытаюсь сделать это, используя подкласс UINavigationBar.

Вот мой подкласс UINavigationBar:

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

И в моем ViewController, который встроен в контроллер навигации, я пишу следующий код в функцию viewDidLoad ()

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

Об ошибках не сообщается, но я ничего не получаю при запуске кода. Совершенно пустой вид. введите описание изображения здесь,

Любое предложение? Или какой-то другой способ изменения высоты? Благодарю.

Автор: Aiden Источник Размещён: 14.08.2015 09:07

Ответы (2)


8 плюса

4054 Репутация автора

Решение

обновление для iOS 11 и выше

Apple не хочет, чтобы вы возились с высотой панели навигации, поэтому не трогайте ее, смотрите здесь: https://openradar.appspot.com/32912789 и здесь: https://forums.developer.apple.com/thread/ 88202 # 274620

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

Я не делаю быстро, но ответ прост, вот ObjC

- (CGSize)sizeThatFits:(CGSize)size {

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

}

Вот моя интерпретация в Swift:

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

Проблема, с которой вы столкнетесь, заключается не в этом методе, это простая часть, проблема в том, чтобы заставить навигационный контроллер всегда использовать эту панель навигации.

Я создаю подкласс и изменяю размер всего в IOS, включая контроллеры навигации и tabbarcontrollers, чтобы обеспечить использование всеми этими контроллерами навигации навигационной панели, вы должны создать подкласс навигационного контроллера и использовать только этот навигационный контроллер во всем приложении, вот как работает подкласс, это Obj С, так что вам придется перевести это:

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

это линия, которая сделает это за вас:

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

О да, и убедитесь, что вы подклассифицируете навигационную панель, вы сказали, что это так, но вот как вы это делаете, все просто:

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

}

Итак, в итоге, подкласс UINavigationBar и UINavigationController, и вы настроены, это позволит вам манипулировать панелью навигации всякий раз, когда вы хотите, вы также можете набрать навигационные панели приведения вашего представления, это немного чокнутый и будет путают много людей, но здесь это идет:

-(CustomNavigationBar *)navBar {

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

поместите вышеупомянутое в свой контроллер вида, а затем назовите это так:

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

Это успешно приведет к тому, что ваш навигационный контроллер станет вашей пользовательской панелью навигации. Если вы хотите изменить высоту навигационной панели отсюда, то вы можете сделать что-то вроде этого:

Автор: Loxx Размещён: 14.08.2015 09:19

8 плюса

131 Репутация автора

Вот простое решение Swift 3, основанное на минимальных подклассах. Первый подкласс UINavigationBar .:

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

Создайте контроллер навигации в коде и используйте инициализатор, который принимает ваш пользовательский класс панели навигации.

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

Все существующее поведение для UINavigationBar сохраняется, и ваша пользовательская высота принимается.

Автор: Jaymassena Размещён: 11.11.2016 03:20
Вопросы из категории :
32x32