QQ抽屉效果

QQ抽屉效果_第1张图片
效果图

//定义属性宏

#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抽屉效果)