gpt4 book ai didi

ios - 以编程方式快速更改导航栏的高度

转载 作者:搜寻专家 更新时间:2023-10-31 21:50:42 25 4
gpt4 key购买 nike

我想制作一个更高的导航栏,我正在尝试使用 UINavigationBar 的子类来实现。

这是我的 UINavigationBar 的子类:

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

在嵌入导航 Controller 的 ViewController 中,我在 viewDidLoad() 函数中编写了以下代码

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

没有报告错误,但是当我运行代码时我什么也没得到。完全空白的 View 。 enter image description here .

有什么建议吗?或者其他改变高度的方法?谢谢。

最佳答案

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

我不做 swift,但答案很简单,这里是 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
}
}

问题不在于此方法,这是简单的部分,问题在于强制导航 Controller 始终使用此导航栏

我对 IOS 中的所有内容进行子类化和调整大小,包括导航 Controller 和 tabbarcontroller,为了强制所有导航 Controller 使用这个导航栏,你必须子类化一个 navigationController 并且只在你的应用程序中使用这个 navigationcontroller,下面是子类的工作原理,这是 Obj C,所以你必须翻译它:

@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 并且您已设置好,这将允许您随时操纵导航栏,您还可以键入 View Controller 的导航栏,这有点小坚果,会让很多人感到困惑,但这里是:

-(CustomNavigationBar *)navBar {

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

把上面的东西放在你的 View Controller 中,然后你这样调用它:

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

这将成功地将你的导航 Controller 类型化为你的自定义导航栏,如果你想从这里更改导航栏的高度,那么你可以这样做:

关于ios - 以编程方式快速更改导航栏的高度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32006330/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com