仿QQ抽屜效果
效果展示:
-QQ效果描述:QQ中的效果是側滑的效果,當導航控制器從左側畫開的時候,左側的視圖也跟著有稍許的滑動。(注意:在這里左側View你即可以添加一viewController,也可以添加一個view)。
-
實現思想:
-
側滑:
- 方法1:
這種稍微有點復雜,側滑我是在導航控制器的view添加一個拖拽手勢,然后在手勢的觸發中,判斷開始滑動的位置是否在左側70個點內,如果在該范圍內就可以滑動并修改導航控制view的transform,否則不能滑動。
- 方法2:
直接使用蘋果原生的API 一個屏幕側滑手勢
UIScreenEdgePanGestureRecognizer *screenPan = [UIScreenEdgePanGestureRecognizer alloc]initWithTarget:self action:@selector(panGesture:); screenPan.edges = UIRectEdgeLeft;
- 定義一個枚舉,用來定義導航控制器滑動的開始位置和結束位置。
typedef enum { BLEViewTransformLocationOriginal, BLEViewTransformLocationLeft }BLEViewTransformLocation;
- 左側View的聯動:我直接在手勢的代理方法中,在改變導航控制器view的transform的同時,也以一定的比例改變左側view的transform
//手勢觸發方法
-
-(void)panGesture:(UIGestureRecognizer *)gesture {
CGFloat panTouchX = [gesture locationInView:self.view].x;
//當滿足手勢在哪個范圍時才有處罰手勢
if (gesture.state == UIGestureRecognizerStateBegan) {
if (panTouchX <= BLEGestureMaxX) {
self.lastPanTouchX = panTouchX;
}
}
//判斷是否滿足拖拽條件范圍
if (self.lastPanTouchX != 0) {
CGPoint currentPoint = [gesture locationInView:self.view];
CGFloat translateDist = currentPoint.x - self.lastPanTouchX;
CGFloat nextTransformX = self.view.transform.tx + translateDist;
//判斷是否會超出左側view
if (nextTransformX <= 0) {
self.transformLocation = BLEViewTransformLocationOriginal;
//判斷是否會超出左側預留的寬度范圍
}else if (nextTransformX >= BLETransformMaxW) {
self.transformLocation = BLEViewTransformLocationLeft;
}else {
self.leftView.transform = CGAffineTransformTranslate(self.leftView.transform, translateDist * 0.3, 0);
self.view.transform = CGAffineTransformTranslate(self.view.transform, translateDist, 0);
}
}
//當拖拽結束的時候會到原始位置
if (gesture.state == UIGestureRecognizerStateEnded) {
self.transformLocation = self.view.transform.tx < BLETransformMaxW * 0.5 ? BLEViewTransformLocationOriginal : BLEViewTransformLocationLeft;
self.lastPanTouchX = 0;
}
}
- 遮罩view:當滑動到最右側后,就添加一個透明遮罩,點擊遮罩,就設置transformLocation 為 BLEViewTransformLocationOriginal,返回到原始位置
-(void)didClickCoverButton{
self.transformLocation = BLEViewTransformLocationOriginal;
}
總結:主要思想就上面那么多,代碼很簡單,大家可以用蘋果自帶的側滑手勢,用一下更加簡潔。