iOS开发之主界面的左右滑动

前言:可能很多iOS开发者在学习之初都会对QQ的主界面的左滑与右滑动感到好奇,今天开始写我人生中的第一篇博客,即:iOS开发之Slide(主界面侧滑侧边栏)。

正文:

首先,新建类(HomeViewController:命名随自己)继承ViewController。

然后我们需要声明这些属性:

//滑动速度系数-建议在0.5-1之间。默认为0.5

@property (nonatomic, assign) CGFloat speedf;

//左侧窗控制器

@property (nonatomic, strong) UIViewController *leftVC;

//右侧滑框控制器

@property (nonatomic, strong) UIViewController *rightVC;

@property (nonatomic,strong) UIViewController *mainVC;

//点击手势控制器,是否允许点击视图恢复视图位置。默认为yes

@property (nonatomic, strong) UITapGestureRecognizer *sideslipTapGes;

//滑动手势控制器

@property (nonatomic, strong) UIPanGestureRecognizer *pan;

//侧滑窗是否关闭(关闭时显示为主页)

@property (nonatomic, assign) BOOL closed;

以及下列方法:

-(instancetype)initWithLeftView:(UIViewController *)leftVC withMainview:(UIViewController *)mainVC withRightVC:(UIViewController *)rightVC;

/**

@brief 关闭左视图

*/

- (void)closeLeftView;

-(void)closeZPFLeftView;

/**

@brief 打开左视图

*/

- (void)openLeftView;

-(void)showZPFleftView;

-(void)showZPFrightView;

-(void)showZPFmainView;

/**

*  设置滑动开关是否开启

*

*  @param enabled YES:支持滑动手势,NO:不支持滑动手势

*/

- (void)setPanEnabled: (BOOL) enabled;

然后在.m文件中我们进行接下来的操作:

@interface LeftSlideViewController ()<UIGestureRecognizerDelegate>

{

CGFloat _scalef;  //实时横向位移

}

@property (nonatomic,strong) UITableView *leftTableview;

@property (nonatomic,assign) CGFloat leftTableviewW;

@property (nonatomic,strong) UIView *contentView;

@property (nonatomic,strong) UIView *rightView;

@end

以及实现我们在.h文件中声明的方法:

-(instancetype)initWithLeftView:(UIViewController *)leftVC withMainview:(UIViewController *)mainVC withRightVC:(UIViewController *)rightVC {

if (self = [super init]) {

self.speedf = vSpeedFloat;

self.leftVC = leftVC;

self.mainVC = mainVC;

self.rightVC = rightVC;

//滑动手势

self.pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(ZPFhandlePan:)];

[self.mainVC.view addGestureRecognizer:self.pan];

[self.pan setCancelsTouchesInView:YES];

self.pan.delegate = self;

self.leftVC.view.hidden = YES;

self.rightVC.view.hidden = YES;

[self.view addSubview:self.leftVC.view];

[self.view addSubview:self.rightVC.view];

[self.view addSubview:self.mainVC.view];

}

return self;

}

#pragma mark -- ZPF左右侧滑

-(void)ZPFhandlePan:(UIPanGestureRecognizer *)rec{

CGPoint point = [rec translationInView:self.view];

_scalef = (point.x*_speedf+_scalef);

//根据视图位置判断是左滑还是右边滑动

if (rec.view.frame.origin.x>=0) {

rec.view.center = CGPointMake(rec.view.center.x+_speedf*point.x,rec.view.center.y );

rec.view.transform = CGAffineTransformScale(CGAffineTransformIdentity, 1-_scalef/1000, 1-_scalef/1000);

[rec setTranslation:CGPointMake(0, 0) inView:self.view];

self.leftVC.view.hidden = NO;

self.rightVC.view.hidden = YES;

}else {

rec.view.center = CGPointMake(rec.view.center.x + point.x*_speedf,rec.view.center.y);

rec.view.transform = CGAffineTransformScale(CGAffineTransformIdentity,1+_scalef/1000,1+_scalef/1000);

[rec setTranslation:CGPointMake(0, 0) inView:self.view];

self.rightVC.view.hidden = NO;

self.leftVC.view.hidden = YES;

}

//手势结束后修正位置

if (rec.state == UIGestureRecognizerStateEnded) {

if (_scalef>140*_speedf) {

[self showZPFleftView];

}else if (_scalef<-140*_speedf){

[self showZPFrightView];

}else{

[self showZPFmainView];

_scalef = 0;

}

}

}

#pragma mark -- 单击手势

-(void)handleZPFTap:(UITapGestureRecognizer *)tap {

if (tap.state == UIGestureRecognizerStateEnded) {

[UIView beginAnimations:nil context:nil];

tap.view.transform = CGAffineTransformScale(CGAffineTransformIdentity,1.0,1.0);

tap.view.center = CGPointMake([UIScreen mainScreen].bounds.size.width/2,[UIScreen mainScreen].bounds.size.height/2);

[UIView commitAnimations];

_scalef = 0;

}

}

#pragma mark -- 修改视图位置

//恢复位置

-(void)showZPFmainView {

[UIView beginAnimations:nil context:nil];

self.mainVC.view.transform = CGAffineTransformScale(CGAffineTransformIdentity,1.0,1.0);

self.mainVC.view.center = CGPointMake([UIScreen mainScreen].bounds.size.width/2,[UIScreen mainScreen].bounds.size.height/2);

[UIView commitAnimations];

}

//显示左视图

-(void)showZPFleftView {

[UIView beginAnimations:nil context:nil];

self.mainVC.view.transform = CGAffineTransformScale(CGAffineTransformIdentity,0.8,0.8);

self.mainVC.view.center = CGPointMake(340,[UIScreen mainScreen].bounds.size.height/2);

self.rightVC.view.hidden = YES;

self.leftVC.view.hidden = NO;

[UIView commitAnimations];

}

//显示右视图

-(void)showZPFrightView {

[UIView beginAnimations:nil context:nil];

self.mainVC.view.transform = CGAffineTransformScale(CGAffineTransformIdentity,0.8,0.8);

self.mainVC.view.center = CGPointMake(self.view.frame.size.width*0.4,[UIScreen mainScreen].bounds.size.height/2);

self.rightVC.view.hidden = NO;

self.leftVC.view.hidden = YES;

[UIView commitAnimations];

}

#pragma mark -- 隐藏左视图

-(void)closeZPFLeftView {

[UIView beginAnimations:nil context:nil];

self.mainVC.view.transform = CGAffineTransformScale(CGAffineTransformIdentity,1.0,1.0);

self.mainVC.view.center = CGPointMake(kScreenWidth / 2, kScreenHeight / 2);

self.closed = YES;

self.leftTableview.center = CGPointMake(kLeftCenterX, kScreenHeight * 0.5);

self.leftTableview.transform = CGAffineTransformScale(CGAffineTransformIdentity,kLeftScale,kLeftScale);

self.contentView.alpha = kLeftAlpha;

[UIView commitAnimations];

[self removeSingleTap];

}

#pragma mark -- 为了界面美观,可以选择隐藏或者显示状态栏

-(BOOL)prefersStatusBarHidden {

return NO;//返回NO表示要显示,返回YES即不显示

}

至此我们已建好我们所需的左右滑动的框架。   注:(如需修改左右滑动的距离,只需修改

self.mainVC.view.transform = CGAffineTransformScale(CGAffineTransformIdentity,0.8,0.8);

self.mainVC.view.center = CGPointMake(340,[UIScreen mainScreen].bounds.size.height/2);

接下来在我们的appdelegate.m文件中进行如下操作:

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

self.window.backgroundColor = [UIColor whiteColor];

[self.window makeKeyAndVisible];

ViewController *cc = [[ViewController alloc] init];

self.mainNavigation = [[UINavigationController alloc] initWithRootViewController:cc];

RightViewController *asdas = [[RightViewController alloc] init];

asdas.view.backgroundColor = [UIColor whiteColor];

LeftViewController *left = [[LeftViewController alloc] init];

left.view.backgroundColor = [UIColor whiteColor];

self.leftSlideVC = [[LeftSlideViewController alloc] initWithLeftView:left withMainview:self.mainNavigation withRightVC:asdas];

[[UINavigationBar appearance] setBarTintColor:[UIColor redColor]];

[[UINavigationBar appearance] setTintColor:[UIColor whiteColor]];

self.window.rootViewController = self.leftSlideVC;

// Override point for customization after application launch.

return YES;

(可能代码比较乱,毕竟帮别人加急写出来的,望大家见谅)。

然后在我们的ViewController中需要触发左右的地方进行如下操作即可:

AppDelegate *app = (AppDelegate *)[[UIApplication sharedApplication] delegate];

if (isLeft == NO) {

[app.leftSlideVC showZPFleftView];

isLeft = YES;

}else{

[app.leftSlideVC closeZPFLeftView];

isLeft = NO;

}

注:isLeft用来判断左按钮是否按下。

好了,cmd+r   尽情的享用我们的左右滑动。

时间: 2024-10-06 20:48:30

iOS开发之主界面的左右滑动的相关文章

豪哥学ios开发之登录界面

首先在ViewController.h文件中: #import <UIKit/UIKit.h> #import "SRWebSocket.h" //继承SRWebSocket.h,作为登录服务器 @interface ViewController : UIViewController<UITextFieldDelegate,SRWebSocketDelegate> //- (IBAction)SaveLogin:(id)sender; //与SB联系账号输入,密

ios开发系列-界面

本章我们通过设计一个简单的登录界面来讲解一下在ios中如何设计界面.打开上章创建的项目后,首先我们要导入几个需要使用的图片.导入方式其实很简单.选中assets.xcassets.然后将使用的图片拖入即可.这里说明一下的是图片的名称最好带个页面前缀什么的,因为虽然可以在assets.xcassets中虽然可以创建文件夹,但最终读取图片的时候是没有路径的,也就是说如果你在不同文件夹下有同名的图片文件的话会出问题.说到图片文件.这里推荐一个找图片资源的网站http://www.easyicon.ne

iOS开发之不同界面传值

iOS开发中不可避免要用到不同界面传值,今天就总结下三种传值方法:闭包传值.代理传值和通知传值. 1.闭包传值 如图建立VC1和VC2,com+R运行正常~把VC2的button用Action关联并设置tag. 在VC2中定义一个闭包 var closures: ((clicked: NSString) -> Void)? 设置VC2中三个button的点击事件(这里三个button的tag设置为101,102,103) @IBAction func numBtn(sender: AnyObje

iOS开发——新特性界面(UICollectionView)

没一款app在刚下载或者更新之后,app有些特色功能需要向用户传递,这个时候我们就要使用新特新界面,用户刚打开软件能看到各种展示图片,左右滑动还可以切换图片,那么新特性界面是如何实现的呢,下面我就用介绍下用如何代码去实现性特性界面,用的是iOS中的UICollectionView,自定义cell去实现的. CollectionViewCell.h中 #import <UIKit/UIKit.h> @interface CollectionViewCell : UICollectionViewC

iOS开发之设置界面的抽取

几乎每款app都会有一个设置的界面!!! 那么我们的设置界面到底要怎么写才能最方便使用呢?下面我就来说说我的想法. 1.观察原型图 2.找出相同的东西,目的是抽出一个基类模块,只要我写好了这个控制器,其它的界面全部都写好了 3.判断是用纯代码还是storyboard,如果界面的控件位置都是固定,用storyboard. 什么时候用静态单元格:如果界面cell跟系统自带的cell完全差不多,就可以选择静态单元格 如果不相似: 1.判断其它cell是否全部差不多,如果全部差不多,可以使用静态单元格

iOS如何让主界面不显示NavigationBar

这个问题曾经困扰过我.现在我给出正解.- (void)viewWillAppear:(BOOL)animated {    [super viewWillAppear:animated]; [self.navigationController setNavigationBarHidden:YES animated:animated];} - (void)viewWillDisappear:(BOOL)animated {    [super viewWillDisappear:animated]

**iOS开发系列--IOS程序开发概览

http://www.cnblogs.com/kenshincui/p/3890880.html 概览 终于到了真正接触IOS应用程序的时刻了,之前我们花了很多时间去讨论C语言.ObjC等知识,对于很多朋友而言开发IOS第一天就想直接看到成果,看到可以运行的IOS程序.但是这里我想强调一下,前面的知识是你日后开发IOS的基础,没有那些知识你开发IOS会很痛苦,现在很多开发人员做开发都是一知半解,程序质量确实令人担忧,所以还是希望大家能够熟练掌握前面的内容,开发过程中多思考,彻底理解程序运行的原理

那些在学习iOS开发前就应该知道的事(part 1)

英文原文:Things I wish I had known before starting iOS development—Part 1 http://www.cocoachina.com/ios/20150608/12052.html 设计师设计出来了一个不错的引导界面,然而当我看到设计稿的时候,我们的app也没几天就要上线了.这个界面模仿了Evernote iOS app的风格. 我以迅雷不及掩耳盗铃之势开始在Xcode上编程,用了page view controller和scroll v

iOS开发系列--IOS程序开发概览ios基础

iOS开发系列--IOS程序开发概览 2014-08-04 19:42 by KenshinCui, 72273 阅读, 81 评论, 收藏,  编辑 概览 终于到了真正接触IOS应用程序的时刻了,之前我们花了很多时间去讨论C语言.ObjC等知识,对于很多朋友而言开发IOS第一天就想直接看到成果,看到可以运行的IOS程序.但是这里我想强调一下,前面的知识是你日后开发IOS的基础,没有那些知识你开发IOS会很痛苦,现在很多开发人员做开发都是一知半解,程序质量确实令人担忧,所以还是希望大家能够熟练掌