[置顶] ios新浪微博自定义tabbar的实现

如何实现新浪微博ios客户端主页的tabbar的样式和效果?

本人通过自定义的tabbar已经实现,效果如下:

1.主页,包含 4个viewController,点击底部的4个button即可切换vc

点击中央的按钮会弹出一个带有高斯模糊的视图



点击底部的中间的加号按钮会弹出一个新的视图,最好做一个 模糊的效果



点击图中,底部栏的叉号即可关闭该弹出的视图!


实现方案:

继承自 UITabBarController

隐藏系统的tabbar即可,自己重写一个 底部的 tabbarView视图即可

代码如下:

.h头文件

//
//  MyTabbarController.h
//  CustomTabbar
//
//  Created by yb on 15/2/7.
//  Copyright (c) 2015年 http://blog.csdn.net/yangbingbinga. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface MyTabbarController : UITabBarController

@end
.m实现文件

//
//  MyTabbarController.m
//  CustomTabbar
//
//  Created by yb on 15/2/7.
//  Copyright (c) 2015年 http://blog.csdn.net/yangbingbinga. All rights reserved.
//

#import "MyTabbarController.h"

//模仿新浪微博的tabbar
//使用方法,通过storyboard拖拽一个tabbarViewController之后绑定该类即可

@interface MyTabbarController ()
@property(strong,nonatomic) UIView *tabbarView;//自定义个底部的tabbar视图
@property(strong,nonatomic)UIView * popView;//点击"+"号弹出的视图,高斯模糊效果
@end

@implementation MyTabbarController


- (void)viewDidLoad
{
    [super viewDidLoad];
    [self configTabbarView];
    [self configPopView];

}


#pragma mark - 点击弹出的视图上的关闭按钮
-(void)tapX
{
    //1.移除当前遮盖视图
    [self.popView removeFromSuperview];
    
}

#pragma mark - 点击自定义的那个tabbar视图上的按钮
-(void)tapButton:(UIButton *)button
{
    
    if (button.tag==2)//点击加号按钮
    {
        
        [UIView animateWithDuration:0.5 animations:^{
            [self.view addSubview:self.popView];//可以自定义一些控件加上动画的效果
        }];
        
        
    }
    
    else if(button.tag>=3) //因为有5个按钮,现在只有4个ViewController,selectedIndex会向前移动一个
    {
        [self setSelectedIndex:button.tag-1];
    }

    else
        
    [self setSelectedIndex:button.tag]; //给tabbar设置选中的ViewController
    
}

#pragma mark - 配置tabbarView
- (void)configTabbarView
{
    self.tabBar.hidden=YES;//隐藏掉系统的bar
    UIScreen *s=[UIScreen mainScreen];
    CGFloat wid=[s bounds].size.width;
    CGFloat height=[s bounds].size.height;
    
    self.tabbarView=[[UIView alloc]initWithFrame:CGRectMake(0, height-48, wid, 48)];
    self.tabbarView.backgroundColor=[UIColor whiteColor];
    [self.view addSubview:self.tabbarView];//自定的tabbar
    for (int i=0; i<5; i++)  //自定义的贴上按钮5个
    {
        UIButton *button=[UIButton buttonWithType:UIButtonTypeCustom];
        button.frame=CGRectMake(i*wid/5.0, 0, wid/5.0, 48);
        UIImage *image=[UIImage imageNamed:[NSString stringWithFormat:@"%d",i]];//设置自定义的按钮
        [button setImage:image forState:UIControlStateNormal];
        button.tag=i;
        [button addTarget:self action:@selector(tapButton:) forControlEvents:UIControlEventTouchUpInside];
        [self.tabbarView addSubview:button];
    }
    
    
}

#pragma mark - 初始化弹出的视图
- (void)configPopView
{
    UIScreen *s=[UIScreen mainScreen];
    CGFloat wid=[s bounds].size.width;
    CGFloat height=[s bounds].size.height;
    //点击中间的按钮弹出一个视图,是自定义的
    self.popView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, wid, height)];
    self.popView.backgroundColor = [UIColor whiteColor];
    UILabel *label=[[UILabel alloc]initWithFrame:CGRectMake(100, 100, 100, 40)];
    [label setText:@"弹出视图!"];
    [label setTextColor:[UIColor blackColor]];
    [self.popView addSubview:label];
    //底部的关闭按钮
    UIButton * button = [UIButton buttonWithType:UIButtonTypeCustom];
    button.frame = CGRectMake(0, height-48, wid, 48);
    [button setImage:[UIImage imageNamed:@"5"] forState:UIControlStateNormal];
    button.backgroundColor=[UIColor lightGrayColor];
    [button addTarget:self action:@selector(tapX) forControlEvents:UIControlEventTouchUpInside];
    [self.popView addSubview:button];

}
@end

使用方法:

使用storyboard创建一个 tabbarController, 给4个viewController设置  为 tabbarController的 viewControllers 数组中的元素,

绑定 自定义的tabbarController类,

storyboard中的结构如下图:



图中有4个  viewController,和一个 tabbarController

原文来自:http://blog.csdn.net/yangbingbinga


本页内容版权归属为原作者,如有侵犯您的权益,请通知我们删除。
维护一个程序,当手机升级到ios8之后就不能接收到远程推送,显示注册失败,查了下资料,原来是没有获取用户许可,加了个方法试了下,ok if ([[[UIDevice currentDevice]systemVersion ]integerValue] = 8) { UIUserNotificationSettings*setting = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert|UIUserNotifi

关于下载Mysql的艰辛历程 - 2015-02-20 11:02:03

一开始在网上随便百度了一下,然后随便下载了一下,然后随便安装了一下,5.6.21.1版本的MySQL,在网上愣是找不到安装教程,安装完之后也找不到bin文件,只能卸载掉,重新下载了老版本的5.0.27,在CSDN下载的,下载的时候竟然压缩包损坏,果断给了一个差评,来安慰我受伤的心灵,不过好像评论的都是好评,作者会不会诅咒我。。。 后来后来又下载了一个版本的,还是打不开,崩溃中,后来就用xampp... 悲剧的一个下午。。
为什么我们觉得自定义View是学习Android的一道坎? 为什么那么多Android大神却认为自定义View又是如此的简单? 为什么google随便定义一个View都是上千行的代码? 以上这些问题,相信学Android的同学或多或少都有过这样的疑问。 那么,看完此文,希望对你们的疑惑有所帮助。 回到主题,自定义View ,需要掌握的几个点是什么呢? 我们先把自定义View细分一下,分为两种 1) 自定义ViewGroup 2) 自定义View 其实ViewGroup最终还是继承之View,当然它内部做了

关于android UI布局自适应 - 2015-02-20 11:02:03

                    原以为上篇就是农历年到来前写的最后一篇了,但是看来现在还是有必要继续把看到的有用的记录一下,算是比较基础的了,以前没怎么关注。                     言归正传,这篇主要说下android的自适应的一点东西,为什么会忽然想起来这个,主要还是因为之前看launcher的代码,其中看到的这段代码始终不明白,所以查了下资料。看下代码,                      BitmapDrawable bitmapDrawable = (BitmapD

ByteBuffer用法小结 - 2015-02-20 11:02:03

转职新公司,接触到的也全是新的。大部分网络请求都是使用Socket。再看Socket又是使用JAVA NIO。各种名词,先学习下ByteBuffer,记录一下。 在NIO中,数据的读写操作始终是与缓冲区相关联的.读取时信道(SocketChannel)将数据读入缓冲区,写入时首先要将发送的数据按顺序填入缓冲区.缓冲区是定长的,基本上它只是一个列表,它的所有元素都是基本数据类型.ByteBuffer是最常用的缓冲区,它提供了读写其他数据类型的方法,且信道的读写方法只接收ByteBuffer.因此ByteBu

Android 打开Gallery - 2015-02-20 11:02:03

     小demo一个,今天用到了,那么就分享给大家,希望对大家有所收获 先上效果图: 示例源码: 1.添加访问sd卡权限   uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" / 2.源码 package com.zengtao.demo;import java.io.FileNotFoundException;import android.content.ContentResolver;import and
5.2 通用的数据操作方式—数据库 说到数据的存取,数据库肯定是一个常用的解决方案。Android中也有它自己的数据库,下面我们来看看Android中的数据库与一般的数据库有什么不一样的地方。 5.2.1SQLite 数据库介绍 目前在Android系统中集成的是SQLite3版本,它支持SQL语句,它是一个轻量级的嵌入式数据库。SQLite支持NULL、INTEGER、REAL、TEXT和BLOB数据类型,不支持静态数据类型,而是使用列关系。可以把SQLite数据库近似看成是一种无数据类型的数据库,你可

01.关于sprite_kit - 2015-02-20 10:02:04

01.关于Sprite Kit Sprite Kit 提供了图像渲染以及动画基础设施,用于纹理图像或者精灵( sprite )的动画制作。 此外, Sprite Kit 采用传统逐帧渲染模式:即每帧先处理帧内容再进行渲染。每一个游戏开发者都是一个“造物神”,决定了游戏世界中每一个场景的内容,以及它们如何相生相息. Sprite Kit 肩负着巨大的任务,它通过图形硬件来渲染动画中的每一帧图像,经过充分优化之后,被渲染的对象能够在每一帧中反复地修改位置。 Sprite Kit 为游戏开发提供了一系列实用性功
该部分我们添加螃蟹伤人事件,道路位置随机添加螃蟹精灵,当角色行走完毕如果停留位置碰到了螃蟹,首先播放伤人动画,然后是播放救护车把角色带走动画。 如果轮流到该角色行走时,吐司提示住院还有几天,当住院天数到期,该角色才可以继续行走 新建了几个精灵类 Item_crab.cpp 螃蟹 Item_emergency.cpp 救护车 Item_fog.cpp 烟雾 Item_stretcher.cpp 担架 //该方法在场景中添加这几个精灵void GameBaseScene::initItemSprite(){it
  NSPredicate            NSPredicate是一个Foundation类,它指定数据被获取或者过滤的方式。       它的查询语言就像SQL的WHERE和正则表达式的交叉一样,提供了具有表现力的,自然语言界面来定义一个集合被搜寻的逻辑条件。       NSPredicate的几种用法        ①常见形式 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name == 'zhangdan'"]; /