码迷,mamicode.com
首页 > 其他好文 > 详细

仿网易抽屉效果

时间:2016-05-05 19:12:14      阅读:224      评论:0      收藏:0      [点我收藏+]

标签:

/**
 *  源代码的链接
 *  链接: http://pan.baidu.com/s/1c2hqDzy 密码: jscx
 */

#import <UIKit/UIKit.h>

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;


@end
#import "AppDelegate.h"

@interface AppDelegate ()

@end

@implementation AppDelegate


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    return YES;
}

@end
#import <UIKit/UIKit.h>

@interface ViewController : UIViewController


@end
#import "ViewController.h"
#import "LFCustomButton.h"
#import "LFLeftView.h"
#import "LFItems.h"
#import "LFSmileViewController.h"
#import "LFCheerViewController.h"
#import "LFHappyViewController.h"

const float leftViewTopGap = 120;
const float viewAnimateDuration = 0.3;
@interface ViewController ()<LFLeftViewDelegate>

@property (nonatomic , strong) UIImageView *bgView;//背景图片

@property (nonatomic , strong) LFLeftView *leftView;//左边的菜单栏

@property (nonatomic , strong) UIButton *coverBtn;//防止内容被操作的按钮

@property (nonatomic , strong) UINavigationController *currentVC;//当前控制器

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
//    controllers = [NSMutableArray array];
    // 设置背景图片
    self.bgView = [[UIImageView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.bgView.backgroundColor = [UIColor blackColor];
    self.bgView.opaque = 0.3;
    // 设置可操作(如果在此不设置可操作,它的子视图是不可以操作的)
    self.bgView.userInteractionEnabled = YES;
    [self.view addSubview:self.bgView];
    
    LFItems *item = [[LFItems alloc] init];
    //图片名
    item.images = @[@"De",@"Dx",@"monkey"];
    //标题的名称
    item.titles = @[@"开心",@"快乐",@"幸福"];
    CGPoint point= CGPointMake(0, leftViewTopGap);
    self.leftView = [[LFLeftView alloc] initWithItem:item originPoint:point];
    self.leftView.delegate = self;
    [self.bgView addSubview:self.leftView];
    
    LFSmileViewController *smileVC = [[LFSmileViewController alloc] init];
    [self initVC:smileVC title:@"开心"];
    LFCheerViewController *cheerVC = [[LFCheerViewController alloc] init];
    [self initVC:cheerVC title:@"快乐"];
    LFHappyViewController *happyVC = [[LFHappyViewController alloc] init];
    [self initVC:happyVC title:@"幸福"];
    // 默认第一个控制器为当前控制器
    self.currentVC = self.childViewControllers[0];
    [self.bgView addSubview:self.currentVC.view];
}

/**
 *  初始化导航控制器
 *
 *  @param vc    控制器
 *  @param title 导航栏的标题
 */
- (void)initVC:(UIViewController *)vc title:(NSString *)title{
    UINavigationController *navi = [[UINavigationController alloc] initWithRootViewController:vc];
    UIBarButtonItem *leftItem = [[UIBarButtonItem alloc] initWithTitle:@"左菜单栏" style:UIBarButtonItemStylePlain target:self action:@selector(showLeftMenuBar)];
    vc.title = title;
    vc.navigationItem.leftBarButtonItem = leftItem;
    [self addChildViewController:navi];
    [navi.view removeFromSuperview];
}

/**
 *  导航栏左边按钮的监听事件
 */
- (void)showLeftMenuBar{
    NSLog(@"显示左菜单栏");
    [self animation];
}

/**
 *  缩小平移动画
 */
- (void)animation{
    [UIView animateWithDuration:viewAnimateDuration animations:^{
        //计算缩放的比例
        float widthScale = 1 - self.leftView.frame.size.width/(UISCREEN_WIDTH*1.0);
        float heightScale = 1 - (leftViewTopGap * 2)/(UISCREEN_HEIGHT *1.0);
        //缩放
        CGAffineTransform scaleTransForm = CGAffineTransformMakeScale(widthScale, heightScale);
        
        //计算平移的距离
        CGFloat distanceX = UISCREEN_WIDTH * (1-widthScale)*0.5;
        //平移(因为moveTransForm是基于scaleTransForm执行动画,所以要除以原来的比例(widthScale))
        CGAffineTransform moveTransForm = CGAffineTransformTranslate(scaleTransForm, distanceX/widthScale, 0);
        
        self.currentVC.view.transform = moveTransForm;
    } completion:^(BOOL finished) {
        self.coverBtn = [UIButton buttonWithType:UIButtonTypeCustom];
        self.coverBtn.frame = self.currentVC.view.bounds;
        self.coverBtn.backgroundColor = [UIColor clearColor];
        [self.coverBtn addTarget:self action:@selector(coverbtnAction:) forControlEvents:UIControlEventTouchUpInside];
        [self.currentVC.view addSubview:self.coverBtn];
    }];
    
}

/**
 *  coverBtn按钮的监听事件
 */
- (void)coverbtnAction:(UIButton *)sender{
    [self recoverAnimation];
}

/**
 *  恢复原来尺寸的动画
 */
- (void)recoverAnimation{
    [UIView animateWithDuration:viewAnimateDuration animations:^{
        self.currentVC.view.transform =CGAffineTransformIdentity;
    } completion:^(BOOL finished) {
        [self.coverBtn removeFromSuperview];
    }];
}

#pragma mark -- LFLeftViewDelegate --
- (void)exchangeControllerFromIndex:(int)index toIndex:(int)nextIndex{
    
    //移除旧控制器
    [self.currentVC.view removeFromSuperview];
    [self recoverAnimation];
    
    //显示新的控制器
    UINavigationController *willShowVC = self.childViewControllers[nextIndex];
    self.currentVC = willShowVC;
    [self.bgView addSubview:willShowVC.view];
    
}

@end
#import <UIKit/UIKit.h>

@interface LFSmileViewController : UIViewController

@end
#import "LFSmileViewController.h"

@interface LFSmileViewController ()

@end

@implementation LFSmileViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor redColor];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    
}



@end
#import <UIKit/UIKit.h>

@interface LFCheerViewController : UIViewController

@end
#import "LFCheerViewController.h"

@interface LFCheerViewController ()

@end

@implementation LFCheerViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor orangeColor];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end
#import <UIKit/UIKit.h>

@interface LFHappyViewController : UIViewController

@end
#import "LFHappyViewController.h"

@interface LFHappyViewController ()

@end

@implementation LFHappyViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor yellowColor];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


@end
#import <Foundation/Foundation.h>

@interface LFItems : NSObject

/**
 *  images存放图片名
 */
@property (nonatomic , strong) NSArray *images;

/**
 *  titles 名称
 */
@property (nonatomic, strong) NSArray *titles;

@end
#import "LFItems.h"

@implementation LFItems

/**
 *  初始化时,给images和titles申请内存
 */
- (instancetype)init
{
    self = [super init];
    if (self) {
        self.images = [[NSArray alloc] init];
        self.titles = [[NSArray alloc] init];
    }
    return self;
}

@end
#import <UIKit/UIKit.h>

@interface LFCustomButton : UIButton

@end
#import "LFCustomButton.h"

const float LFCustomButtonScale = 0.5;

@implementation LFCustomButton

/**
 *  重写按钮title的尺寸
 */
- (CGRect)titleRectForContentRect:(CGRect)contentRect
{
    return CGRectMake(contentRect.size.width * LFCustomButtonScale, 0, contentRect.size.width *(1 - LFCustomButtonScale), contentRect.size.height);
}

/**
 *  重写按钮Image的尺寸
 */
- (CGRect)imageRectForContentRect:(CGRect)contentRect
{
    CGRect titleFrame = CGRectMake(0, 0, contentRect.size.width * LFCustomButtonScale, contentRect.size.height);
    return titleFrame;
}

@end
#import <UIKit/UIKit.h>

@class LFItems;
@protocol LFLeftViewDelegate;

@interface LFLeftView : UIView

@property (nonatomic , weak) id<LFLeftViewDelegate> delegate;

/**
 *  初始化的方法
 *
 *  @param item  数据(title和image)
 *  @param point 在父视图的初始位置
 *
 *  @return 返回LFLeftView的对象
 */
- (LFLeftView *)initWithItem:(LFItems *)item originPoint:(CGPoint)point;

@end

@protocol LFLeftViewDelegate <NSObject>

- (void)exchangeControllerFromIndex:(int)index toIndex:(int)nextIndex;

@end
#import "LFLeftView.h"
#import "LFItems.h"
#import "LFCustomButton.h"
#import "UIImage+CreatImageWithColor.h"
#define LFCustomButtonWidth  UISCREEN_WIDTH/2.0
#define LFCustomButtonHeight  60

@interface LFLeftView()

@property (nonatomic, strong) LFItems *item;

@property (nonatomic, strong) NSMutableArray *buttons;

@property (nonatomic, strong) UIButton *currentBtn;//当前选中的按钮

@end

@implementation LFLeftView

- (LFLeftView *)initWithItem:(LFItems *)item originPoint:(CGPoint)point
{
    self = [super init];
    if (self) {
        if (item == nil) {
            return nil;
        }
        self.buttons = [NSMutableArray array];
        self.userInteractionEnabled = YES;
        self.item = item;
        self.frame = CGRectMake(point.x, point.y, LFCustomButtonWidth, LFCustomButtonHeight * self.item.titles.count);
        [self creatButtons];
    }
    return self;
}

/**
 *  创建按钮
 */
- (void)creatButtons{
    //创建button的个数
    int count = (int)self.item.titles.count;
    // 通过循环创建按钮
    for (int i = 0; i < count; i++) {
        LFCustomButton *button = [LFCustomButton buttonWithType:UIButtonTypeCustom];
        //设置选中时的背景图片
        [button setBackgroundImage:[UIImage imageWithColor:[UIColor colorWithRed:253/255.0 green:0 blue:0 alpha:0.2]] forState:UIControlStateSelected];
        //默认第一个按钮为当前选中按钮
        if (i == 0) {
            self.currentBtn = button;
            self.currentBtn.selected = YES;
        }
        button.backgroundColor = [UIColor grayColor];
        [button setTitle:self.item.titles[i] forState:0];
        if (self.item.images[i] != nil) {
            [button setImage:[UIImage imageNamed:self.item.images[i]] forState:0];
        }
        button.tag = i;
        [button addTarget:self action:@selector(buttonAction:) forControlEvents:UIControlEventTouchUpInside];
        [self addSubview:button];
        [self.buttons addObject:button];
    }
}

/**
 *  按钮的监听事件
 */
- (void)buttonAction:(UIButton *)sender{
    NSLog(@"从第%ld个按钮跳到第%ld个按钮",(long)self.currentBtn.tag,(long)sender.tag);
    if ([_delegate respondsToSelector:@selector(exchangeControllerFromIndex: toIndex:)]) {
        [_delegate exchangeControllerFromIndex:(int)self.currentBtn.tag toIndex:(int)sender.tag];
    }
    //取消当前按钮选中状态
    self.currentBtn.selected = NO;
    //设置当前按钮为选中的按钮
    self.currentBtn = sender;
    // 设置当前按钮为选中状态
    self.currentBtn.selected = YES;
}

- (void)layoutSubviews{
    [super layoutSubviews];
    // 设置所有子视图的尺寸
    for (int i = 0; i < self.buttons.count; i++) {
        UIButton *button = self.buttons[i];
        button.frame = CGRectMake(0, i*LFCustomButtonHeight, LFCustomButtonWidth, LFCustomButtonHeight);
    }
}

@end
#import <UIKit/UIKit.h>

@interface UIImage (CreatImageWithColor)

/**
 *  通过颜色生成该纯颜色的图片
 *
 *  @param color 生成图片的颜色
 *
 *  @return 返回图片
 */
+ (UIImage *)imageWithColor:(UIColor *)color;

/**
 *  通过颜色生成该纯颜色的图片
 *
 *  @param color  生成图片的颜色
 *  @param width  生成图片的宽
 *  @param height 生成图片的高
 *
 *  @return 返回图片
 */
+ (UIImage *)imageWithColor:(UIColor *)color imageWidth:(CGFloat)width imageWithHeight:(CGFloat)height;

@end
#import "UIImage+CreatImageWithColor.h"

@implementation UIImage (CreatImageWithColor)

+ (UIImage *)imageWithColor:(UIColor *)color{
    return [UIImage imageWithColor:color imageWidth:100 imageWithHeight:100];
}

+ (UIImage *)imageWithColor:(UIColor *)color imageWidth:(CGFloat)width imageWithHeight:(CGFloat)height{
    
    //开启基于位图的图形上下文
    UIGraphicsBeginImageContextWithOptions(CGSizeMake(width,height), NO, 0.0);
    // 设置画笔的颜色
    [color set];
    // 画矩形,并填充
    UIRectFill(CGRectMake(0, 0, width, height));
    //获取图片
    UIImage *resultImage = UIGraphicsGetImageFromCurrentImageContext();
    //关闭上下文
    UIGraphicsEndImageContext();
    
    return resultImage;
}

@end
#ifndef PrefixHeader_pch
#define PrefixHeader_pch

// Include any system framework and library headers here that should be included in all compilation units.
// You will also need to set the Prefix Header build setting of one or more of your targets to reference this file.

#define UISCREEN_WIDTH [UIScreen mainScreen].bounds.size.width
#define UISCREEN_HEIGHT [UIScreen mainScreen].bounds.size.height


#endif /* PrefixHeader_pch */

 

仿网易抽屉效果

标签:

原文地址:http://www.cnblogs.com/lantu1989/p/5462623.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!