抽屉效果
来源:互联网 发布:爱.回家知乎 编辑:程序博客网 时间:2024/05/16 01:25
//// ViewController.m#import "ViewController.h"// 获取屏幕的宽度#define screenW [UIScreen mainScreen].bounds.size.width@interface ViewController ()@property(nonatomic,weak)UIView *leftV;@property(nonatomic,weak)UIView *rightV;@property(nonatomic,weak)UIView *mainV;@end@implementation ViewController- (void)viewDidLoad { [super viewDidLoad]; // 添加子控件 [self createChildView]; // 添加pan手势 UIPanGestureRecognizer *panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)]; [self.view addGestureRecognizer:panRecognizer]; // 添加tap手势 UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tap)]; [self.view addGestureRecognizer:tapRecognizer];}#pragma mark - tap的方法- (void)tap{ if (self.mainV.frame.origin.x != 0) { [UIView animateWithDuration:0.25 animations:^{ self.mainV.frame = self.view.bounds; }]; }}#pragma mark - pan的方法- (void)pan:(UIPanGestureRecognizer *)recognizer{ // 获取手势移动的位置 CGPoint point = [recognizer translationInView:self.view]; // 获取X轴心偏移量 CGFloat offsetX = point.x; // 修改mainV的frame self.mainV.frame = [self frameWithOffsetX:offsetX]; // 判断mainV的x是否大于0 if (self.mainV.frame.origin.x > 0) { // 往右边滑动,隐藏rightV self.rightV.hidden = YES; }else if (self.mainV.frame.origin.x < 0){ // 往左边滑动,显示rightV self.rightV.hidden = NO; } // 复位 [recognizer setTranslation:CGPointZero inView:self.view]; // 判断当手势结束的时候,定位 if (recognizer.state == UIGestureRecognizerStateEnded) { // 定位点 CGFloat target = 0; if (self.mainV.frame.origin.x > screenW * 0.5) { // 定位到右边 target = 220; }else if (CGRectGetMaxX(self.mainV.frame) < screenW * 0.5 ){ target = -200; } // 获取X轴偏移量 CGFloat offsetX = target - self.mainV.frame.origin.x; // 动画改变frame [UIView animateWithDuration:0.25 animations:^{ self.mainV.frame = target == 0 ? self.view.bounds : [self frameWithOffsetX:offsetX]; }]; }}/** * 根据offsetX计算mainV的frame */#define kMaxY 80- (CGRect)frameWithOffsetX:(CGFloat)offsetX{ /* 手指往右移动,视图X轴也要往右移动(x++) 同时Y轴向下移动(y++),尺寸缩放(按比例) */ // 获取上一次的frame CGRect frame = self.mainV.frame; // 获取上一次的高度 CGFloat preH = frame.size.height; // 获取上一次的宽度 CGFloat preW = frame.size.width; // 获取屏幕的高度 CGFloat screenH = [UIScreen mainScreen].bounds.size.height; // X轴每平移一点,Y轴需要移动 CGFloat offsetY = offsetX * kMaxY / screenW; // 获取当前的高度 CGFloat currentH = frame.size.height - offsetY * 2; if (frame.origin.x < 0) { // 往左边滑动 currentH = frame.size.height + offsetY * 2; } // 获取尺寸的缩放比例 CGFloat scale = currentH / preH; // 获取当前的宽度 CGFloat currentW = preW * scale; // 计算x frame.origin.x += offsetX; // 计算y frame.origin.y = (screenH - currentH) / 2; frame.size.height = currentH; frame.size.width = currentW; return frame;}#pragma mark - 添加子控件/** * 创建子控件 */- (void)createChildView{ UIView *leftV = [[UIView alloc] initWithFrame:self.view.bounds]; leftV.backgroundColor = [UIColor orangeColor]; [self.view addSubview:leftV]; self.leftV = leftV; UIView *rightV = [[UIView alloc] initWithFrame:self.view.bounds]; rightV.backgroundColor = [UIColor blueColor]; [self.view addSubview:rightV]; self.rightV = rightV; UIView *mainV = [[UIView alloc] initWithFrame:self.view.bounds]; mainV.backgroundColor = [UIColor redColor]; [self.view addSubview:mainV]; self.mainV = mainV;}@end
演示:
0 0
- 抽屉效果
- 抽屉效果
- 抽屉效果
- 抽屉效果
- 抽屉效果
- 抽屉效果
- 抽屉效果
- 抽屉效果
- 抽屉效果
- 抽屉效果
- 抽屉效果
- 实现Android 抽屉效果
- android 抽屉 效果
- android 抽屉效果
- android抽屉效果
- android--抽屉效果
- Android 抽屉效果Demo
- SlidingDrawer--抽屉效果
- 简析类与对象,组合类,派生类的初始化过程
- 异常处理和错误
- [读书笔记]《Android开发艺术探索》第十五章笔记
- Android HttpClient GET或者POST请求基本使用方法
- 微软在线测试之lucky string,有关斐波那契的题目都在此了
- 抽屉效果
- BASIC-14时间转换取余 数字字符混合输出VIP试题
- 蜘蛛牌
- java计划任务调度框架quartz结合spring实现调度的配置实例代码分享
- 滤波
- 白话经典算法系列之六 快速排序 快速搞定(转)
- Rescue
- 如何将make编译之后的错误信息重定向到一个文件中
- 相册的操作