iOS-抽屜效果

前言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地址,SimpleLeftSlideDemoit

 

總結io

抽屜效果的第三方已經有不少,可是未必能徹底符合項目的需求,因此自行定製是比較好的方式,何況邏輯也不復雜,關鍵要注意處理好邊界值與手勢衝突。form

相關文章
相關標籤/搜索