Oc UITabBarController+侧滑视图第三方(RE

2017-11-07  本文已影响0人  Wang99

创建工程
添加第三方RESideMenu
添加PCH文件Starry.pch
在程序Build Settings 的Prefix Header 写上$(SRCROOT)/工程名称/Starry.pch

Starry.pch

ifndef Starry_pch

define Starry_pch

/*
常用头文件的导入
*/

import "BaseViewController.h"

import "AppDelegate.h"

define App_Delegate (AppDelegate *)[UIApplication sharedApplication].delegate

/*
系统版本号
*/

define VERSION_10_0 [UIDevice currentDevice].systemVersion.doubleValue >= 10.0

define VERSION_9_0 [UIDevice currentDevice].systemVersion.doubleValue >= 9.0

/*
用于适配的宏
*/

define SCR_W [UIScreen mainScreen].bounds.size.width

define SCR_H [UIScreen mainScreen].bounds.size.height

//适配x轴的宏

define FIT_X(w) (SCR_W / 375. *(w))

//适配Y轴的宏

define FIT_Y(h) (SCR_H / 667. *(h))

/*
当前app版本号的宏
*/

define VERSION_CURRENT [[NSBundle mainBundle].infoDictionary objectForKey:@"CFBundleShortVersionString"]

//持久化当前版本号的key的宏

define NOT_FIRST_LANUCH @"NotFirstLanuch"

/*
Doucuments目录的宏
*/

define DOCUMENT_PATH [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]

endif /* Starry_pch */

AppDelegate.h

import <UIKit/UIKit.h>

import <CoreData/CoreData.h>

import "RESideMenu.h" // 抽屉视图第三方

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (nonatomic,strong)RESideMenu *sideMenu;
@property (strong, nonatomic) UIWindow *window;

@property (readonly, strong) NSPersistentContainer *persistentContainer;

@end

AppDelegate.m

import "AppDelegate.h"

import "LeftMenuViewController.h"

import "NewsViewController.h"

import "WeatherViewController.h"

import "LiveShowViewController.h"

@interface AppDelegate ()
@property (nonatomic,strong)UITabBarController *tabBarCtl;//标签栏控制器
@property (nonatomic,strong)LeftMenuViewController *leftVC;//左侧菜单控制器
@end

@implementation AppDelegate

pragma mark - 私有方法

//私有方法,用于生成一个导航控制器

pragma mark-侧滑控制器

//左侧菜单

pragma mark- UIApplicationDelegate

return YES;

}

引导页控制器------
第三方引导页ImageScrollView.h

import <UIKit/UIKit.h>

/// 表示图片滚动视图的样式
typedef enum {
ImageScrollType_Guide = 100, // 开机guide视图样式
ImageScrollType_Banner // banner栏样式
}ImageScrollType;

/// 协议,触发事件回调的方法
@protocol ImageScrollViewDelegate <NSObject>
@optional
/// “guide”样式的最后一个视图上的“立即体验”按钮触发
-(void)experienceDidHandle;
/// “banner”样式每一个图片触发回调的方法;index表示选中的图片的下标
-(void)bannerImageDidHandleWithIndex:(NSInteger)index;
@end

@interface ImageScrollView : UIScrollView

/// 参数1:滚动视图位置(建议以4.7寸屏设置); 参数2:样式 ; 参数3:图片名称数组 ; 参数4:guide样式的“立即体验”按钮标题;参数5:字体颜色 参数6:guide样式的“立即体验”按钮位置;参数7:banner轮播图时间间隔 ; 参数8:代理设置,用于触发事件回调
-(instancetype)initWithFrame:(CGRect)frame
style:(ImageScrollType)type
images:(NSArray *)imgNameArr
confirmBtnTitle:(NSString *)title
confirmBtnTitleColor:(UIColor *)titleColor
confirmBtnFrame:(CGRect)btnFrame
autoScrollTimeInterval:(NSTimeInterval)interval
delegate:(id<ImageScrollViewDelegate>)delegate;

/// 给ImageScrollView的父视图添加分页控件,必须把ImageScrollView加为父视图的子视图之后再调用方法
-(void)addPageControlToSuperView:(UIView *)superView;

@end

ImageScrollView.m

import "ImageScrollView.h"

define SCR_W [UIScreen mainScreen].bounds.size.width // 屏幕宽度

define SCR_H [UIScreen mainScreen].bounds.size.height // 屏幕高度

define FIT_X(x) (SCR_W/375.*(x)) // 用于x轴适配

define FIT_Y(y) (SCR_H/667.*(y)) // 用于y轴适配

@interface ImageScrollView ()<UIScrollViewDelegate>
{
ImageScrollType _type; // 样式
NSString *_confirmBtnTitle; // 确认按钮标题
CGRect _confirmBtnFrame; // 确认按钮位置
UIColor *_confirmBtnTitleColor; // 确认按钮标题颜色
NSUInteger _imgCount; // 图片个数
CGFloat _disX; //在X轴的移动距离
}
@property(nonatomic,assign)id<ImageScrollViewDelegate>scDelegate;
@property(nonatomic,strong)NSTimer *myTimer; // 定时器
@property(nonatomic,strong)UIPageControl *pageCtl; // 分页控件
@end

@implementation ImageScrollView

pragma mark - 对外接口

/// 实例化方法
-(instancetype)initWithFrame:(CGRect)frame
style:(ImageScrollType)type
images:(NSArray *)imgNameArr
confirmBtnTitle:(NSString *)title
confirmBtnTitleColor:(UIColor *)titleColor
confirmBtnFrame:(CGRect)btnFrame
autoScrollTimeInterval:(NSTimeInterval)interval
delegate:(id<ImageScrollViewDelegate>)delegate {

self = [super initWithFrame:frame];
if (self) {
    if (type == ImageScrollType_Guide)
    {
        // 设置内容视图大小
        self.contentSize = CGSizeMake(frame.size.width * imgNameArr.count, frame.size.height);
    }
    else
    {
        // 设置内容视图大小
        self.contentSize = CGSizeMake(frame.size.width * (imgNameArr.count+2), frame.size.height);
    }
    
    
    
    // 样式赋值
    _type = type;
    // 图片数量赋值
    _imgCount = imgNameArr.count;
    // guide样式固定大小
    if (type == ImageScrollType_Guide) {
        self.frame = CGRectMake(0, 0, SCR_W, SCR_H);
        self.contentSize = CGSizeMake(SCR_W * imgNameArr.count, SCR_H);
        
        _confirmBtnTitle = title;
        _confirmBtnFrame = btnFrame;
        _confirmBtnTitleColor = titleColor;
    }
    // 隐藏滚动条
    self.showsVerticalScrollIndicator = NO;
    self.showsHorizontalScrollIndicator = NO;
    // 开启分页属性
    self.pagingEnabled = YES;
    // 设置UIScrollView代理
    self.delegate = self;
    // 设置自定义的代理
    self.scDelegate = delegate;
    // 添加图片子视图
    [self addImageSubViews:imgNameArr];
    // 添加定时器
    if(type == ImageScrollType_Banner) {
        self.myTimer = [NSTimer scheduledTimerWithTimeInterval:interval target:self selector:@selector(timerDidHandle:) userInfo:nil repeats:YES];
    }


}
return self;

}

/// 添加分页控件方法
-(void)addPageControlToSuperView:(UIView *)superView {
[superView addSubview:self.pageCtl];
}

pragma mark - 分页控制器实例化getter重写

/// 添加分页子视图
-(UIPageControl *)pageCtl{
if (!_pageCtl) {
_pageCtl = [[UIPageControl alloc] initWithFrame:CGRectMake(0, 0, FIT_X(300), FIT_Y(25))];
if (_type == ImageScrollType_Guide)
{
_pageCtl.center = CGPointMake(SCR_W/2, SCR_H-FIT_Y(30));
}

    else{
        _pageCtl.center = CGPointMake(self.frame.origin.x + self.frame.size.width/2, self.frame.origin.y + self.frame.size.height-FIT_Y(25));
    }
    _pageCtl.pageIndicatorTintColor = [UIColor grayColor];
    _pageCtl.currentPageIndicatorTintColor = [UIColor redColor];
    _pageCtl.hidesForSinglePage = YES;
    _pageCtl.numberOfPages = _imgCount;
    _pageCtl.currentPage = 0;
}
return _pageCtl;

}

pragma mark - 添加图片子视图

/// 添加图片子视图
-(void)addImageSubViews:(NSArray *)imgNameArr {

if (_type == ImageScrollType_Guide)
{
    for (int i = 0; i<imgNameArr.count; i++) {
        // 实例化图形视图
        UIImageView *imgView = [[UIImageView alloc] initWithFrame:CGRectMake(0 + i * self.frame.size.width, 0, self.frame.size.width, self.frame.size.height)];
        // 添加为滚动视图的子视图
        [self addSubview:imgView];
        // 设置图形视图的图片
        imgView.image = [UIImage imageNamed:imgNameArr[i]];
    
            // 最后一个图形视图
            if(i==imgNameArr.count-1){
                imgView.userInteractionEnabled = YES;
                UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
                btn.frame = _confirmBtnFrame;
                [btn setTitle:_confirmBtnTitle forState:UIControlStateNormal];
                [btn setTitleColor:_confirmBtnTitleColor forState:UIControlStateNormal];
                [btn addTarget:self action:@selector(confirmBtnDidHandle:) forControlEvents:UIControlEventTouchUpInside];
                [imgView addSubview:btn];
            }
        
    }

}
//banner样式
else
{
    for (int i = 0; i < imgNameArr.count+2; i++)
    {
        UIImageView *imgView = [[UIImageView alloc] initWithFrame:CGRectMake(0+self.frame.size.width*i, 0, self.frame.size.width, self.frame.size.height)];
        //添加self的子视图
        [self addSubview:imgView];
        if (i == 0) // 第一个图片子视图加载的是图片数组中最后一张图片
        {
            imgView.image = [UIImage imageNamed:imgNameArr[imgNameArr.count-1]];
            imgView.tag = imgNameArr.count-1;
        }
        else if (i == imgNameArr.count +1)// 最后一个图片子视图加载的是图片数组的第一张
        {
            imgView.image = [UIImage imageNamed:imgNameArr[0]];
            imgView.tag = 0;
        }
        else  // 中间图片子视图的图片设置
        {
            imgView.image = [UIImage imageNamed:imgNameArr[i-1]];
            imgView.tag = i-1;
        }
        imgView.userInteractionEnabled = YES;
        UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapDidHandle:)];
        [imgView addGestureRecognizer:tap];
        //设定_disX的初始值
        _disX = self.frame.size.width;
        //设置子视图的开始滚动位置
        [self setContentOffset:CGPointMake(_disX, 0) animated:YES];
    }
}

}

pragma mark - 触发方法

// 定时器触发的方法
-(void)timerDidHandle:(NSTimer *)t {
_disX += self.frame.size.width;

[self scrollRectToVisible:CGRectMake(_disX, self.frame.origin.y, self.frame.size.width, self.frame.size.height) animated:YES];

}

/// guide最后视图上的“立即体验”按钮触发
-(void)confirmBtnDidHandle:(UIButton *)btn {
if ([self.scDelegate respondsToSelector:@selector(experienceDidHandle)]) {
[self.scDelegate experienceDidHandle];
}
}

/// banner图片点击后触发
-(void)tapDidHandle:(UITapGestureRecognizer *)tap {
// 获取触发了该点击手势的视图对象
UIView *tapView = tap.view;

if (![tapView isKindOfClass:[UIImageView class]]) {
    return;
}

NSInteger tag = tapView.tag;
if ([self.scDelegate respondsToSelector:@selector(bannerImageDidHandleWithIndex:)])  {
    [self.scDelegate bannerImageDidHandleWithIndex:tag];
}

}

pragma mark - UIScrollViewDelegate

-(void)scrollViewDidScroll:(UIScrollView *)scrollView {

//guide样式
if (_type == ImageScrollType_Guide)
{
    // 获取滚动视图滚动的距离
CGPoint pos = scrollView.contentOffset;

// 获取当前的分页的下标
NSInteger index = (int)(pos.x/self.frame.size.width);
// 改变分页控制器的当前下标
self.pageCtl.currentPage = index;

}
//banner样式
else
{
    // 获取滚动视图滚动的距离
    CGPoint pos = scrollView.contentOffset;
    //赋值
    _disX = pos.x;
    //如果滚动到第一个图片子视图将内容视图的起始位置变换置倒数第二张图的位置
    if (_disX == 0)
    {
        [self setContentOffset:CGPointMake(self.frame.size.width*_imgCount, 0) animated:NO];
        
    }
    else if (_disX == self.frame.size.width * (_imgCount+1))
    {
        [self setContentOffset:CGPointMake(self.frame.size.width, 0) animated:NO];
    }
    
    /*
     设置分页控制器当前分页
    */
    //最后一张图的点
    if (_disX == 0 || _disX == self.frame.size.width*_imgCount)
    {
        self.pageCtl.currentPage = _imgCount-1;
    }
    //第一张图片
    else if (_disX == self.frame.size.width || _disX == self.frame.size.width * (_imgCount+1))
    {
        self.pageCtl.currentPage = 0;
    }
    //其他图片
    else
    {
        self.pageCtl.currentPage = (int)(_disX / self.frame.size.width)-1;
    }
}

}

/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.

@end

GuideViewController.h

import <UIKit/UIKit.h>

@interface GuideViewController : UIViewController

@end
GuideViewController.m

import "GuideViewController.h"

import "ImageScrollView.h"

import "AppDelegate.h"

@interface GuideViewController ()<ImageScrollViewDelegate>

@end

@implementation GuideViewController

}

pragma mark -ImageScrollViewDelegate

}

/*

pragma mark - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation

@end

LeftMenuViewController.h

import <UIKit/UIKit.h>

@interface LeftMenuViewController : UIViewController

@end

LeftMenuViewController.m

import "LeftMenuViewController.h"

import "LoginViewController.h"

@interface LeftMenuViewController ()<UITableViewDelegate,UITableViewDataSource>
{
NSArray *_tableDatas;//表格数据
}
//头像视图
@property(nonatomic,strong)UIImageView *headImgView;
//账号lable
@property(nonatomic,strong)UILabel *accountLable;
//表格
@property(nonatomic,strong)UITableView *table;
//登录控制器
@property (nonatomic,strong)LoginViewController *loginVC;
@end

@implementation LeftMenuViewController

pragma mark - 控制器实例化

//登录控制器

pragma mark- 控件实例化

//头像视图

}
return  _accountLable;

}
//表格

pragma mark-UITableViewDataSource

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return _tableDatas.count;
}

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *identifier = @"cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
if (!cell)
{
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];

}
cell.textLabel.text = _tableDatas[indexPath.row];
cell.textLabel.textAlignment = NSTextAlignmentCenter;
cell.backgroundColor = [UIColor clearColor];
cell.textLabel.textColor = [UIColor whiteColor];
cell.textLabel.font = [UIFont systemFontOfSize:18.0];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
return cell;

}

pragma mark -触发事件

//头像点击触发事件

pragma mark- loadView

pragma mark

/*

pragma mark - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation

@end

NewsViewController.h

import <UIKit/UIKit.h>

@interface NewsViewController : BaseViewController

@end
NewsViewController.m

import "NewsViewController.h"

@interface NewsViewController ()

@end

@implementation NewsViewController

}

/*

pragma mark - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation

@end

WeatherViewController.h

import <UIKit/UIKit.h>

@interface WeatherViewController : BaseViewController

@end
WeatherViewController.m

import "WeatherViewController.h"

@interface WeatherViewController ()

@end

@implementation WeatherViewController

}
/*

pragma mark - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation

@end

LiveShowViewController.h

import <UIKit/UIKit.h>

@interface LiveShowViewController : BaseViewController

@end
LiveShowViewController.m

import "LiveShowViewController.h"

@interface LiveShowViewController ()

@end

@implementation LiveShowViewController

/*

pragma mark - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation

@end

上一篇下一篇

猜你喜欢

热点阅读