前言git
關於第三方的抽屜效果有不少,比較實用的有兩個RESideMenu和MMDrawerController,可是裏面的代碼邏輯很複雜,可是有時候需求並不須要如此,因此本身去實現效果也並不難,抽屜效果的邏輯並不複雜。抽屜效果結構,大致上分爲3個部分,背景視圖、列表視圖以及內容視圖(在最上面);所以只要把內容視圖移動一段距離就能夠實現。github
實現的關鍵代碼部分,內容視圖移動的距離計算公式:containerView手勢開始時的起始位置+拖動的距離 = containerView最後的移動距離。即ide
CGFloat translationOffsetX = [gesture translationInView:gesture.view].x;code
newFrame.origin.x = [self roundedOriginXForDrawerConstriants:CGRectGetMinX(self.startPanRect) + translationOffsetX];//計算滑動距離orm
newFrame = CGRectIntegral(newFrame);ci
CGFloat offsetX = newFrame.origin.x;get
// 這個響應手勢的回調是個關鍵的地方,涉及拖動距離的計算方法,即手勢開始時的containerView的origin.x加上手勢拖動的位移translationOffsetX(向左拖動值爲負數,向右拖動值爲正數),滑動的最大位移maximumLeftDrawerWidth可從新制定;手勢結束後,經過判斷containerView的origin.x是否大於等於maximumLeftDrawerWidth的一半或者是x軸方向的速度是否大於panVelocityXAnimationThreshold,決定open或close。 - (void)handlePanGestureAction:(UIPanGestureRecognizer *)gesture { switch (gesture.state) { case UIGestureRecognizerStateBegan: { self.startPanRect = self.containerView.frame;//手勢開始時的初始frame break; } case UIGestureRecognizerStateChanged: { self.view.userInteractionEnabled = NO; CGRect newFrame = self.startPanRect; CGFloat translationOffsetX = [gesture translationInView:gesture.view].x; newFrame.origin.x = [self roundedOriginXForDrawerConstriants:CGRectGetMinX(self.startPanRect) + translationOffsetX];//計算滑動距離 newFrame = CGRectIntegral(newFrame); CGFloat offsetX = newFrame.origin.x; self.containerView.transform = CGAffineTransformMakeTranslation(offsetX, 0); if (self.scaleContainView) { CGFloat scale = 1 - (1 - self.contentViewScaleValue) * (offsetX / self.maximumLeftDrawerWidth); self.containerView.transform = CGAffineTransformScale(self.containerView.transform, scale, scale); } break; } case UIGestureRecognizerStateEnded: case UIGestureRecognizerStateCancelled: { self.startPanRect = CGRectNull; CGPoint velocity = [gesture velocityInView:gesture.view]; [self finishAnimationForPanGestureWithXVelocity:velocity.x]; self.view.userInteractionEnabled = YES; break; } default: break; } }
Github地址,SimpleLeftSlideDemo。it
總結io
抽屜效果的第三方已經有不少,可是未必能徹底符合項目的需求,因此自行定製是比較好的方式,何況邏輯也不復雜,關鍵要注意處理好邊界值與手勢衝突。form