当前位置:   article > 正文

修改UITabBar高度_uview tabbar 高度怎么设置

uview tabbar 高度怎么设置

背景

iOS系统框架UIKit提供了可供使用的tab视图UITabBar,使用起来很方便,但是它是有一个默认高度的,在外部是不能随便修改的。

如果我们想通过如下代码设置tabBar的高度为56的话,会发现设置不生效,无论高度写多少,tabBar的高度总是不变,还是系统默认的高度。

self.tabBar = [[UITabBar alloc] initWithFrame:CGRectMake(0, CGRectGetMaxY(self.view.frame)-56, CGRectGetWidth(self.view.frame), 56)];
  • 1

那么怎么修改系统默认的tabBar的高度呢?

修改系统默认UITabBar高度

1. 自己实现一个TabBar视图

我们可以模仿系统的UITabBar的风格,样式和API,自己定义一个TabBar。自定义的好处就是想怎么改就怎么改,怎么玩都行。

自定义这里就不说了,比较简单,这里重点说一下第二个办法,复写-sizeThatFits()方法。

2. 复写-sizeThatFits()方法

UITabBar继承于UIView,UIView有一个方法:

- (CGSize)sizeThatFits:(CGSize)size;     // return 'best' size to fit given size. does not actually resize view. Default is return existing view size
  • 1

在view内复写这个方法返回一个size来重设view的宽和高。一般的UIView我们也不用重写该方法,因为外部直接能设置其frame来设置view的宽和高,UITabBar有点特殊,它是系统给定了一个高度的。

创建一个类继承UITabBar,直接在内部复写-sizeThatFits()方法返回固定的宽和高,直接返回一个我们想要的高度。

// over wite this function to changed the tabbar height.
- (CGSize)sizeThatFits:(CGSize)size
{
    CGSize fitsSize = [super sizeThatFits:size];
    fitsSize.height = 56;// give a height to tabbar
    return fitsSize;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

上面的做法可以实现业务,但是同时代码也被写死了,外部也是不能通过设置frame来改变tabBar的高度,我们可以通过下面的方法来实现外部直接通过frame来设置tabBar的高度,像UIView一样。

首先,我们创建一个全局变量originFrame来接外部传进来的尺寸,
其次,复写-sizeThatFits()方法来设置tabBar传入的尺寸。

@interface ENTabBar ()

@property (nonatomic) CGRect originFrame;

@end

@implementation ENTabBar

// over wite this function to changed the tabbar height.
- (CGSize)sizeThatFits:(CGSize)size
{
//    CGSize fitsSize = [super sizeThatFits:size];
//    fitsSize.height = 56;// give a height to tabbar
//    return fitsSize;
    return self.originFrame.size;
}

- (instancetype)initWithFrame:(CGRect)frame
                       titles:(NSArray <NSString *> *)titles
                   imageNames:(NSArray <NSString *> *)imageNames
{
    if (self = [super initWithFrame:frame])
    {
        self.originFrame = frame;
        
        NSMutableArray *items = [NSMutableArray array];
        for (int i = 0; i < titles.count; i++)
        {
            // set the image, origin image and do not disturbed by tint color.
            UIImage *image = [UIImage imageNamed:imageNames[i]];
            UIImage *correctImage = [image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
            
            UITabBarItem *item = [[UITabBarItem alloc] initWithTitle:titles[i] image:correctImage tag:i+1000];
            
            // item text set
            [item setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:
            [UIColor blackColor], NSForegroundColorAttributeName, nil] forState:UIControlStateNormal];
            
            [items addObject:item];
        }
        [self setItems:items];
    }
    return self;
}

- (NSUInteger)indexOfItem:(UITabBarItem *)item
{
    NSAssert(![self.items containsObject:item], @"unvalid item");
    return [self.items indexOfObject:item];
}

@end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52

这样的话我们就可以直接像UIView一样,在外部直接设置TabBar的高度了。

self.tabBar = [[ENTabBar alloc] initWithFrame:CGRectMake(0, CGRectGetMaxY(self.view.frame)-56, CGRectGetWidth(self.view.frame), 56) titles:titles imageNames:imageNames];
  • 1

扩展

继承UIView的空间都可以使用上面的方法实现宽度和高度的重新设置,如果有必要的话。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/76930
推荐阅读
相关标签
  

闽ICP备14008679号