QQ抽屉效果

效果图

//定义属性宏

#define LWKeyPath(objc, keyPath) @(((void)objc.keyPath, #keyPath))

#define screenW [UIScreen mainScreen].bounds.size.width

#define screenH [UIScreen mainScreen].bounds.size.height

#define MaxY100

#define targetR300

#define targetL -220


@interface ViewController()

@property(nonatomic,weak)UIView*mainV;

@property(nonatomic,weak)UIView*leftV;

@property(nonatomic,weak)UIView*rightV;

@end

@implementation ViewController

- (void)viewDidLoad {

[superviewDidLoad];

//添加控件

[selfsetUpAllViews];

//添加手势

[selfsetGesture];

//添加点控手势

[selfsetTapGesture];

//添加监听frame移动方向的kvo

// KVO作用:时刻监听某个对象的某个属性的改变

// _main frame属性的改变

// Observer:观察者

// KeyPath:监听的属性

[_mainVaddObserver:selfforKeyPath:LWKeyPath(_mainV,frame)options:NSKeyValueObservingOptionNewcontext:nil];

}

- (void)observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary*)change context:(void*)context{

if(_mainV.frame.origin.x>0) {

_rightV.hidden=YES;

}elseif(_mainV.frame.origin.x<0){

_rightV.hidden=NO;

}

}

-(void)dealloc{

[_mainVremoveObserver:selfforKeyPath:LWKeyPath(_mainV,frame)];

}

//点控手势

- (void)setTapGesture{

//新建点控手势识别

UITapGestureRecognizer*tap = [[UITapGestureRecognizeralloc]initWithTarget:selfaction:@selector(tap)];

[self.viewaddGestureRecognizer:tap];

}

//点控触发事件

- (void)tap{

[UIViewanimateWithDuration:0.25animations:^{

_mainV.frame= [UIScreenmainScreen].bounds;

}];

}

//添加手势

- (void)setGesture{

//拖拽手势

UIPanGestureRecognizer*pan = [[UIPanGestureRecognizeralloc]initWithTarget:selfaction:@selector(panGestureRecognizer:)];

//添加到控件上

[_mainVaddGestureRecognizer:pan];

}

//触发拖拽事件

- (void)panGestureRecognizer: (UIPanGestureRecognizer*)panGR{

//获取手势的偏移量

CGPointtransP = [panGRtranslationInView:_mainV];

//获取x轴的偏移量,相对于上一次

CGFloatoffsetX = transP.x;

//平移

//    _mainV.transform = CGAffineTransformTranslate(_mainV.transform, offsetX, 0);

//    //要想实现相对上个位置的移动,就要实现复位

//    //复位

//    [panGR setTranslation:CGPointZero inView:_mainV];

//使用frame同时实现压缩

_mainV.frame= [selfframeWithOffsetX:offsetX];

//手势操作时,实现相对效果,就要复位

[panGRsetTranslation:CGPointZeroinView:_mainV];

//如果拖拽手势结束

if(panGR.state==UIGestureRecognizerStateEnded) {

CGFloattarget =0;

//判断当前的frame

if(_mainV.frame.origin.x>screenW*0.5) {

//右移一半以上

target =targetR;

}elseif(CGRectGetMaxX(_mainV.frame)

//左移一半以上

target =targetL;

}

//获得x的偏移量

offsetX = target -_mainV.frame.origin.x;

//动画跳转新的frame

[UIViewanimateWithDuration:0.25animations:^{

_mainV.frame= [selfframeWithOffsetX:offsetX];

}];

}

}

- (CGRect)frameWithOffsetX: (CGFloat)offsetX{

//获取当前main的frame

CGRectframe =_mainV.frame;

//计算当前的x,y,w,h

CGFloatx = frame.origin.x+ offsetX;

//去x的绝对值,排除掉左移,y值变大的效果

CGFloattem_x =fabs(x);

//获取最新的y等比例缩放

CGFloaty = tem_x/screenW*MaxY;

//获取最新的高度

CGFloath =screenH-2* y;

//获取最新的缩放值

CGFloatscale = h/screenH;

//获取最新的宽度

CGFloatw =screenW* scale;

returnCGRectMake(x, y, w, h);

}

//添加控件

- (void)setUpAllViews{

//红色

UIView*v1 = [[UIViewalloc]initWithFrame:[UIScreenmainScreen].bounds];

v1.backgroundColor= [UIColorredColor];

[self.viewaddSubview:v1];

_leftV= v1;

//蓝色

UIView*v2 = [[UIViewalloc]initWithFrame:[UIScreenmainScreen].bounds];

v2.backgroundColor= [UIColorblueColor];

[self.viewaddSubview:v2];

_rightV= v2;

//黄色

UIView*v3 = [[UIViewalloc]initWithFrame:[UIScreenmainScreen].bounds];

v3.backgroundColor= [UIColoryellowColor];

[self.viewaddSubview:v3];

_mainV= v3;

}

- (void)didReceiveMemoryWarning {

[superdidReceiveMemoryWarning];

// Dispose of any resources that can be recreated.

}

@end

推荐阅读更多精彩内容

  • 仿QQ抽屉效果 效果展示: -QQ效果描述:QQ中的效果是侧滑的效果,当导航控制器从左侧画开的时候,左侧的视图也跟...
    BlueEagleBoy阅读 1,289评论 3 6
  • 抽屉效果几乎在每一个APP中都能遇到。那么最为一个iOS开发人员怎么好意思不懂其中的原理呢。如果你愿意花上3分钟来...
    十三_Black阅读 1,227评论 2 6
  • 其实网上类似的实现已经很多了,原理也并不难,只是网上各种demo运行下来,多少都有一些问题。折腾了半天,决定自己实...
    Horrarndoo阅读 1,175评论 0 1
  • 首先看一下使用方式,其中ZWDrawerViewController 是封装的抽屉效果视图控制器,tabbarVC...
    ZhengYaWei阅读 360评论 0 13
  • 自己写的简单抽屉效果,大概原理都是一样的,直接放代码。 #import"DrawViewController.h"...
    BEYOND黄阅读 197评论 0 3
  • 不喜阅读 85评论 0 1
  • 岸草离离蔓蔓,芳歇雨落沙洲。 日暮橹声江上远,晚凉滴翠强收。 近水人倾池月,捻眉谁数闲愁。 白马天街甫霁,借得燕绕...
    君子包阅读 104评论 2 9
  • 你就那样悄无声息的来,又悄无声息的走了,没有任何征兆,没有任何理由,任我拼命地嘶喊,拼命地挽留,你都没有任何回应!...
    清泽阅读 132评论 0 1