UITabBar 和 UINavigationBar 样式的定制

对于定义UITabBar来说我们就是要创建一个和tabBar尺寸相同的View,当点击View部分时候View通知我们的UITabBarController点击的index,然后由controller调整选择的控制器.

自定义tabbar.h的文件

#import <UIKit/UIKit.h>

@interface YZMTabItem :UIView
@property(nonatomic,copy)NSString *title;
@property(nonatomic,copy)NSString *normalImage;
@property(nonatomic,copy)NSString *selectedImage;

-(BOOL)isSelected;
-(void)setSelected:(BOOL)selected;
@end

//数据源方法
@class YZMTabBar;
@protocol YZMTabBarDataSource <NSObject>
//有多少选项
@required
-(NSInteger)numOfItemInTabbar;
-(YZMTabItem *)tabbar:(YZMTabBar *)tabbar itemAtIndex:(NSInteger)index;
@end
//代理方法
@protocol YZNTabBarDelegate <NSObject>

-(void)tabbar:(YZMTabBar *)tabbar didSelectedItemAtIndex:(NSInteger)index;

@end

@interface YZMTabBar : UIView
@property(nonatomic,weak)id<YZMTabBarDataSource> dateSource;
@property(nonatomic,weak)id<YZNTabBarDelegate> delegate;
//外部改变当前选中的值
-(void)selectItemAtIndex:(NSInteger)index;
@end


tabbar.m

#import "YZMTabBar.h"

#define imageW 25
#define imageH 25
#define titleW 50
#define titleH 20

#define diffItemTag 100

@interface YZMTabItem ()
{
    BOOL _selected;
}
//@property(nonatomic,assign,getter=isSelected)BOOL selected;
@property(nonatomic,strong)UIImageView *imageView;
@property(nonatomic,strong)UILabel *titleLabel;
@end
@implementation YZMTabItem

//初始化方法
-(instancetype)initWithFrame:(CGRect)frame
{
    if (self=[super initWithFrame:frame]) {
        
        CGFloat viewW=frame.size.width;
        CGFloat viewH=frame.size.height;
        [self setBackgroundColor:[UIColor clearColor]];
        
        _imageView=[[UIImageView alloc] initWithFrame:CGRectMake((viewW-imageW)*0.5, (viewH-imageH-titleH)*0.5, imageW, imageH)];
        [self addSubview:_imageView];
        
        _titleLabel=[[UILabel alloc] initWithFrame:CGRectMake((viewW-titleW)*0.5, CGRectGetMaxY(_imageView.frame), titleW, titleH)];
        _titleLabel.font=[UIFont systemFontOfSize:14.0f];
        _titleLabel.textAlignment=NSTextAlignmentCenter;
//        [_titleLabel setBackgroundColor:[UIColor redColor]];
        [self addSubview:_titleLabel];
    }
    return self;
}


-(void)setSelected:(BOOL)selected
{
    _selected=selected;
    if (_selected) {
        _imageView.image=[UIImage imageNamed:self.selectedImage];
        _titleLabel.textColor=[UIColor colorWithRed:245/255.0 green:102/255.0 blue:147/255.0 alpha:1];
        [self showAnimation];
    }else{
        _imageView.image=[UIImage imageNamed:self.normalImage];
        _titleLabel.textColor=[UIColor grayColor];
    }
}

-(void)showAnimation
{
    CAKeyframeAnimation *animation=[CAKeyframeAnimation animationWithKeyPath:@"transform.scale"];
    animation.values=@[[NSNumber numberWithFloat:1.0],[NSNumber numberWithFloat:0.5],[NSNumber numberWithFloat:1.2],[NSNumber numberWithFloat:1.0]];
    animation.duration=1;
    [self.layer addAnimation:animation forKey:animation.keyPath];
    
}
-(BOOL)isSelected
{
    return _selected;
}

-(void)setNormalImage:(NSString *)normalImage
{
    _normalImage=normalImage;
    //按钮的初始化状态为未选中
    [self setSelected:NO];
}
-(void)setTitle:(NSString *)title
{
    _title=title;
    self.titleLabel.text=title;
}
@end



struct{
    unsigned int numOfItemInTabbarMethod :1;
    unsigned int itemAtIndexMethod :1;
}dataSourceFlag;



@interface YZMTabBar ()
{
    NSInteger selectedItemTag;//当前选中的itemtag
}
@end

@implementation YZMTabBar

-(void)setDateSource:(id<YZMTabBarDataSource>)dateSource
{
    
    _dateSource=dateSource;
    selectedItemTag=-1;
    [self setBackgroundColor:[UIColor colorWithRed:42/255.0 green:176/255.0 blue:252/255.0 alpha:1]];
    
    //方法是否有定义
    dataSourceFlag.numOfItemInTabbarMethod=[_dateSource respondsToSelector:@selector(numOfItemInTabbar)];

    dataSourceFlag.itemAtIndexMethod=[_dateSource respondsToSelector:@selector(tabbar:itemAtIndex:)];
//    NSAssert(!dataSourceFlag.numOfItemInTabbarMethod, @"数据源方法未定义");
    
    NSInteger numberOfItems=[_dateSource numOfItemInTabbar];
    for(int i=0;i<numberOfItems;i++){
        UIView *itemView=[_dateSource tabbar:self itemAtIndex:i];
        itemView.tag=i+diffItemTag;
        UITapGestureRecognizer *tap=[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(TapOnItemView:)];
        [itemView addGestureRecognizer:tap];
        [self addSubview:itemView];
        
    }
    
    
}

-(void)TapOnItemView:(UIGestureRecognizer *)gesture
{
    YZMTabItem *view=(YZMTabItem *)gesture.view;
    if (view.tag==selectedItemTag) {
        return;
    }
    if (selectedItemTag!=-1) {
        YZMTabItem *selectedView=(YZMTabItem *)[self viewWithTag:selectedItemTag];
        [selectedView setSelected:NO];
    }
    selectedItemTag=view.tag;
    [view setSelected:YES];
    
    if ([_delegate respondsToSelector:@selector(tabbar:didSelectedItemAtIndex:)]) {
        [_delegate tabbar:self didSelectedItemAtIndex:selectedItemTag-diffItemTag];
    }
    
}

-(void)selectItemAtIndex:(NSInteger)index
{
    if (selectedItemTag==index+diffItemTag) {
        return;
    }
    if (selectedItemTag!=-1) {
        YZMTabItem *selectedView=(YZMTabItem *)[self viewWithTag:selectedItemTag];
        [selectedView setSelected:NO];
    }
    selectedItemTag=index+diffItemTag;
    YZMTabItem *view=(YZMTabItem *)[self viewWithTag:selectedItemTag];
    [view setSelected:YES];
    
    if ([_delegate respondsToSelector:@selector(tabbar:didSelectedItemAtIndex:)]) {
        [_delegate tabbar:self didSelectedItemAtIndex:selectedItemTag-diffItemTag];
    }
    
    
}<pre name="code" class="objc">    UINavigationBar *navigationBar=[UINavigationBar appearance];
    UIImage *resizeImage=[self imageByApplyingAlpha:0.99 image:[UIImage imageNamed:@"navogatinBar_bk.jpg"]];
    [navigationBar setBackgroundImage:resizeImage forBarMetrics:UIBarMetricsDefault];

 在tabBarController中使用 

- (void)viewDidLoad {
    [super viewDidLoad];
    
    
    //添加控制器
    [self addControllers];

    _itemSettingArray=@[@[@"首页",@"C01.png",@"C02.png"],
                        @[@"订单",@"C03.png",@"C04.png"],
                        @[@"我",@"C05.png",@"C06.png" ],
                        @[@"更多",@"C07.png",@"C08.png"]
                        ];
    YZMTabBar *tabbar=[[YZMTabBar alloc] initWithFrame:CGRectMake(0, 0, SCREENWIDTH, 100)];
    tabbar.dateSource=self;
    tabbar.delegate=self;
    [self.tabBar addSubview:tabbar];
    [tabbar selectItemAtIndex:0];
    
    
}


//删除除自定义外的所有子视图
-(void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    for(UIView *view in self.tabBar.subviews)
    {
        if (![view isKindOfClass:[YZMTabBar class]]) {
            [view removeFromSuperview];
        };
    }
    
    
}
-(void)addControllers
{
    HomeViewController *homeVC=[[HomeViewController alloc] init];
    [self AddSubController:homeVC withTitle:@"首页"];
    OrderViewController *orderVC=[[OrderViewController alloc] init];
    [self AddSubController:orderVC withTitle:@"订单"];
    MeViewController *meVC=[[MeViewController alloc] initWithNibName:@"MeViewController" bundle:nil];
    [self AddSubController:meVC withTitle:@"我"];
    MoreViewController *moreVC=[[MoreViewController alloc] initWithNibName:@"MoreViewController" bundle:nil];
    [self AddSubController:moreVC withTitle:@"更多"];
    //默认选择
//    [self setSelectedIndex:0];
}

#pragma mark dateSource
-(NSInteger)numOfItemInTabbar
{
    NSLog(@"%lu",_itemSettingArray.count);
    return _itemSettingArray.count;
}
-(YZMTabItem *)tabbar:(YZMTabBar *)tabbar itemAtIndex:(NSInteger)index
{
    
    CGFloat itemW=SCREENWIDTH/_itemSettingArray.count;
    CGFloat itemH=49;
    YZMTabItem *item=[[YZMTabItem alloc] initWithFrame:CGRectMake(index*itemW, 0, itemW, itemH)];
    item.title=_itemSettingArray[index][0];
    item.normalImage=_itemSettingArray[index][1];
    item.selectedImage=_itemSettingArray[index][2];
    return item;
    
}

#pragma mark delegate
-(void)tabbar:(YZMTabBar *)tabbar didSelectedItemAtIndex:(NSInteger)index
{
    NSLog(@"%lu",index);
    [self setSelectedIndex:index];
    
}




-(void)AddSubController:(UIViewController *)controller withTitle:(NSString *)name
{
//    
    controller.title=name;
    YZMNavigationController *navigation=[[YZMNavigationController alloc] initWithRootViewController:controller];
    [self addChildViewController:navigation];
}

这样去设计也借鉴一些写的比较好的代码.

我们封装了barItem:他有图片和文字组成,他的模型参考的UIButton,(初始化,设置素材,可选切换,自定义动画)

TabBar的设计模型参考了tableView:有数据源,代理方法,并为添加到自身的tabbarItem设置管理方法.


UINavigationBar :

1.设置他的setBackgroundImage:forBarMetrics:会出现一种情况,我们的控制器的视图会向下偏移.解决的办法我们可以调整image的Alpha为0.99

这个现象就不会出现了


    UINavigationBar *navigationBar=[UINavigationBar appearance];
    UIImage *resizeImage=[self imageByApplyingAlpha:0.99 image:[UIImage imageNamed:@"navogatinBar_bk.jpg"]];
    [navigationBar setBackgroundImage:resizeImage forBarMetrics:UIBarMetricsDefault];

//设置图片透明度

+ (UIImage *)imageByApplyingAlpha:(CGFloat)alpha  image:(UIImage*)image
{
    UIGraphicsBeginImageContextWithOptions(image.size, NO, 0.0f);
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    CGRect area = CGRectMake(0, 0, image.size.width, image.size.height);
    CGContextScaleCTM(ctx, 1, -1);
    CGContextTranslateCTM(ctx, 0, -area.size.height);
    CGContextSetBlendMode(ctx, kCGBlendModeMultiply);
    CGContextSetAlpha(ctx, alpha);
    CGContextDrawImage(ctx, area, image.CGImage);
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    return newImage;
    
}

2.设置Navigation导航条的透明度,

不可行的方法,就是直接设置Navigation的alpha,因为导航条还会有其他的图层.

可行的就是弄一张1*1的透明的图设置成setBackgroundImage:forBarMetrics:的image(这样会使得整个导航条变得透明化)

然后在添加一个view到navigationBar的下方,通过调整这个view的透明度就可以实现我们的背景的透明化.

        CGSize size=self.navigationBar.bounds.size;
        UIView *alphaView=[[UIView alloc] initWithFrame:CGRectMake(0, 0, size.width, size.height+20)];
        [alphaView setBackgroundColor:[UIColor whiteColor]];
        alphaView.alpha=0.8;
        UIView *flagView=[[UIView alloc] initWithFrame:CGRectMake(0, alphaView.height-1, alphaView.width, 1)];
        [flagView setBackgroundColor:[UIColor colorWithRed:220/255.0 green:220/255.0 blue:220/255.0 alpha:1]];
        [alphaView addSubview:flagView];
        
        [self.view insertSubview:alphaView belowSubview:self.navigationBar];
        [self.navigationBar setBackgroundImage:[UIImage imageNamed:@"bigShadow.png"] forBarMetrics:UIBarMetricsCompact];
        self.navigationBar.layer.masksToBounds = YES;

定制UINavigationBar 的apperenc(主题)

我们通过设置这个属性可以改变接下来用UINavigationBar创建的所有实例的样式,但是对于之前的没有效果,而且一种navigationbar只会有一种样式.作为新建实例的一个参照.









  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园的建设目标是通过数据整合、全面共享,实现校园内教学、科研、管理、服务流程的数字化、信息化、智能化和多媒体化,以提高资源利用率和管理效率,确保校园安全。 智慧校园的建设思路包括构建统一支撑平台、建立完善管理体系、大数据辅助决策和建设校园智慧环境。通过云架构的数据中心与智慧的学习、办公环境,实现日常教学活动、资源建设情况、学业水平情况的全面统计和分析,为决策提供辅助。此外,智慧校园还涵盖了多媒体教学、智慧录播、电子图书馆、VR教室等多种教学模式,以及校园网络、智慧班牌、校园广播等教务管理功能,旨在提升教学品质和管理水平。 智慧校园的详细方案设计进一步细化了教学、教务、安防和运维等多个方面的应用。例如,在智慧教学领域,通过多媒体教学、智慧录播、电子图书馆等技术,实现教学资源的共享和教学模式的创新。在智慧教务方面,校园网络、考场监控、智慧班牌等系统为校园管理提供了便捷和高效。智慧安防系统包括视频监控、一键报警、阳光厨房等,确保校园安全。智慧运维则通过综合管理平台、设备管理、能效管理和资产管理,实现校园设施的智能化管理。 智慧校园的优势和价值体现在个性化互动的智慧教学、协同高效的校园管理、无处不在的校园学习、全面感知的校园环境和轻松便捷的校园生活等方面。通过智慧校园的建设,可以促进教育资源的均衡化,提高教育质量和管理效率,同时保障校园安全和提升师生的学习体验。 总之,智慧校园解决方案通过整合现代信息技术,如云计算、大数据、物联网和人工智能,为教育行业带来了革命性的变革。它不仅提高了教育的质量和效率,还为师生创造了一个更加安全、便捷和富有智慧的学习与生活环境。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值