-
事件处理-抽屉效果——滑动处理
-
事件处理-抽屉效果——缩放处理
-
事件处理-抽屉效果——滑动定位
-
事件处理-抽屉效果——定位视图复位
2.1 界面关系
-
DrawViewCOntroller继承UIViewController
-
启动界面的ViewController继承DrawViewCOntroller
三 事件处理-抽屉效果——滑动处理(DrawViewController)
3.1 添加子控件(左、右、中三个view)
- (void)addSubView
{
//left view
UIView *leftView=[[UIView alloc]initWithFrame:self.view.bounds];
leftView.backgroundColor=[UIColor greenColor];
[self.view addSubview:leftView ];
_leftView=leftView;
//right view
UIView *rightView=[[UIView alloc]initWithFrame:self.view.bounds];
rightView.backgroundColor=[UIColor blueColor];
[self.view addSubview:rightView];
_rightView=rightView;
//main view
UIView *mainView=[[UIView alloc]initWithFrame:self.view.bounds];
mainView.backgroundColor=[UIColor redColor];
[self.view addSubview:mainView];
_mainView=mainView;
}
3.2 滑动视图处理
-(void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
//获取UITouch对象
UITouch *touch=[touches anyObject];
//获取当前点
CGPoint currentPoint=[touch locationInView:self.view];
//获取上一个点
CGPoint prePoint=[touch precisePreviousLocationInView:self.view];
//x轴偏移量
CGFloat offsetX=currentPoint.x-prePoint.x;
//获取主视图的frame
CGRect frame=_mainView.frame;
frame.origin.x+=offsetX;
_mainView.frame=frame;
}
3.3 监听_mainView的frame的改变
[_mainView addObserver:self forKeyPath:@“frame” options:NSKeyValueObservingOptionNew context:nil];
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context
{
//NSLog(@"%@",NSStringFromCGRect(_mainView.frame));
if (_mainView.frame.origin.x<0) { //向左滑动
_rightView.hidden=NO;//显示右边
_leftView.hidden=YES;//隐藏左边
}else if(_mainView.frame.origin.x>0){ //向右滑动
_rightView.hidden=YES;//隐藏右边
_leftView.hidden=NO;//显示左边
}
}
4.1 效果
4.2 原理
假设:移动的x距离为320,y距离为50
-
offsetY=offsetX*50/320
-
scale=currentH/screenH
-
currentH=screenH-2*offsetY
-
x=frame.origin.x+offsetX
-
h=frame.size.height*scale
-
w=frame.size.weight*scale
-
y=(screenH-h)*0.5
4.3 滑动时处理
获取当前视图view
- (CGRect)getCurrentFrameWithOffsetX:(CGFloat)offsetX
{
CGFloat screenW=[UIScreen mainScreen].bounds.size.width;
CGFloat screenH=[UIScreen mainScreen].bounds.size.height;
//获取y轴偏移量,手指每移动一点,y轴偏移多少
CGFloat offsetY=offsetX*MaxY/screenW;
CGFloat scale=(screenH-2*offsetY)/screenH;
if (_mainView.frame.origin.x<0) { //往左边滑动
scale=(screenH+2*offsetY)/screenH;
}
//获取之前的frame
CGRect frame=_mainView.frame;
分享读者
作者2013年java转到Android开发,在小厂待过,也去过华为,OPPO等大厂待过,18年四月份进了阿里一直到现在。
被人面试过,也面试过很多人。深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长,而且极易碰到天花板技术停滞不前!
我们整理了一份阿里P7级别的Android架构师全套学习资料,特别适合有3-5年以上经验的小伙伴深入学习提升。
主要包括腾讯,以及字节跳动,阿里,华为,小米,等一线互联网公司主流架构技术。如果你有需要,尽管拿走好了。
如果你觉得自己学习效率低,缺乏正确的指导,可以点击加入资源丰富,学习氛围浓厚的技术圈一起学习交流吧!
群内有许多来自一线的技术大牛,也有在小厂或外包公司奋斗的码农,我们致力打造一个平等,高质量的Android交流圈子,不一定能短期就让每个人的技术突飞猛进,但从长远来说,眼光,格局,长远发展的方向才是最重要的。
35岁中年危机大多是因为被短期的利益牵着走,过早压榨掉了价值,如果能一开始就树立一个正确的长远的职业规划。35岁后的你只会比周围的人更值钱。
2%E4%BD%95%E9%9D%A2%E8%AF%95%E6%8B%BF%E9%AB%98%E8%96%AA%EF%BC%81.md)!**
群内有许多来自一线的技术大牛,也有在小厂或外包公司奋斗的码农,我们致力打造一个平等,高质量的Android交流圈子,不一定能短期就让每个人的技术突飞猛进,但从长远来说,眼光,格局,长远发展的方向才是最重要的。
35岁中年危机大多是因为被短期的利益牵着走,过早压榨掉了价值,如果能一开始就树立一个正确的长远的职业规划。35岁后的你只会比周围的人更值钱。