我想制作一个更高的导航栏,我想尝试使用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")
没有报告错误,但是在运行代码时我什么都没得到。一个完全空白的视图。 。
有什么建议吗?或者其他一些改变高度的方法?感谢。
答案 0 :(得分:8)
iOS 11及更高版本的更新
苹果不希望你弄乱导航栏的高度,所以不要碰它 见这里:https://openradar.appspot.com/32912789 在这里:https://forums.developer.apple.com/thread/88202#274620class 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)子类化并调整大小,为了强制所有导航控制器使用此导航栏,您必须子类化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的子类,这样你就可以随时操作导航栏了,你也可以输入你的视图控制器的导航栏,这是一点点坚果会让很多人感到困惑,但在这里:
-(CustomNavigationBar *)navBar {
return (id)[self.navigationController navigationBar];
}
将上面的内容放在你的视图控制器中然后你这样调用它:
[[self navBar] setBackGroundColor:[UIColor blueColor]];
这将成功将您的导航控制器强制转换为自定义导航栏,如果您想从此处更改导航栏的高度,那么您可以执行以下操作:
答案 1 :(得分:8)
这是一个基于最小子类的简单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的所有现有行为,并采用您的自定义高度。