IOS-抽屉效果

本文介绍了如何在iOS中实现抽屉效果,通过简单的UIView组装和计算移动时的frame来达成。提供了一个抽屉效果的Demo项目下载链接,便于开发者直接使用。
摘要由CSDN通过智能技术生成

抽屉效果的封装,我一般很少打字,一般我们开发也直接是看代码片段,拿来直接用,我直接把简单封装的抽屉效果demo 项目连接扔上来害羞

其实抽屉是UIView的组装,判断好位置计算好移动时的view的frame 以及通知和定位

核心代码:

#pragma mark - 拖动手势
- (void)pan:(UIPanGestureRecognizer *)pan
{
    CGPoint point = [pan translationInView:self.view];
    
    self.mainView.frame = [self frameWithOffsetX:point.x];
    
    // 判断下mainV的x是否大于0 
    [self observeValueForKeyPath:nil ofObject:nil change:nil context:nil];
    
    //复位
    [pan setTranslation:CGPointZero inView:self.view];
    
    //判断手势结束位置,做定位
    CGFloat target = 0;
    if (pan.state == UIGestureRecognizerStateEnded) {
        if (self.mainView.frame.origin.x > P_SCREEN_WIDTH / 2) {
            target = kTargetR;
        }else if (CGRectGetMaxX(self.mainView.frame) < P_SCREEN_WIDTH / 2){
            target = kTargetL;
        }
        
        CGFloat offsetX = target - self.mainView.frame.origin.x;

        [UIView animateWithDuration:0.25 animations:^{
            self.mainView.frame = target == 0 ?
            self.view.bounds:[self frameWithOffsetX:offsetX];
        }];
    }
}

#pragma mark - 根据offsetX计算main的frame
- (CGRect)frameWithOffsetX:(CGFloat)offsetX
{
    //获取上一次的frame
    CGRect frame = self.mainView.frame;

    //Y轴偏移
    CGFloat offsetY = offsetX * kMaxY / P_SCREEN_HEIGHT;
    
    //获取上次的高度
    CGFloat preH = frame.size.height;
    
    //获取当前宽度
    CGFloat preW = frame.size.width;
    
    //获取当前高度
    CGFloat curH = preH - 2 * offsetY;

    if (frame.origin.x < 0) {
        //往左移动
        curH = preH +2 *offsetY;
    }
    
    //获取尺寸的缩放比例
    CGFloat scale = curH / preH;
    
    //获取当前的宽度
    CGFloat curW = preW * scale;
    
    //获取当前的frame
    frame.origin.x += offsetX;
    frame.origin.y = (P_SCREEN_HEIGHT - curH) / 2;;
    frame.size.height = curH;
    frame.size.width = curW;
    
    
    return frame;
}
#pragma mark - 通知
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context
{
    if (self.mainView.frame.origin.x >0) {
        //往右边移动
        self.rightView.hidden = YES;
    }else if (self.mainView.frame.origin.x <0){
        //往左边移动
        self.rightView.hidden = NO;
    }
}



点击下面文字下载demo

IOS抽屉效果Demo下载





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值