美文网首页
ios控件拖动改变位置的实现【转】

ios控件拖动改变位置的实现【转】

作者: 陈大帅 | 来源:发表于2022-04-28 11:46 被阅读0次
    #define SCREEN_WIDTH            ([UIScreen mainScreen].nativeBounds.size.width / [UIScreen mainScreen].nativeScale)
    
    #define SCREEN_HEIGHT           ([UIScreen mainScreen].nativeBounds.size.height / [UIScreen mainScreen].nativeScale)
    
    #define SMALLWIDTH                 self.firstSmallPreView.frame.size.width   //self.firstSmallPreView为响应拖动手势的控件
    
    #define SMALLHEIGHT               self.firstSmallPreView.frame.size.height
    
    #define animateDuration  0.3       //位置改变动画时间
    
    
    //给拖动控件添加手势
    
    UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(changeLocation:)];
    
    [self.firstSmallPreView addGestureRecognizer:pan];
    
    [self.view addSubview:self.firstSmallPreView];
    

    第一种:任意拖动控件靠边停留实现:

    - (void)changeLocation:(UIPanGestureRecognizer *)pan{
        
        self.firstSmallPreView = pan.view;
        
        CGPoint panPoint = [pan locationInView:[[UIApplication sharedApplication] keyWindow]];
        
        if(pan.state == UIGestureRecognizerStateBegan)
            
        {
            
            [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(changeStatus) object:nil];
            
        }
        
        if(pan.state == UIGestureRecognizerStateChanged)
            
        {
            
            self.firstSmallPreView.center = CGPointMake(panPoint.x, panPoint.y);
            
        }
        
        else if(pan.state == UIGestureRecognizerStateEnded)
            
        {
            
            if(panPoint.x <= SCREEN_WIDTH/2)
                
            {
                
                if(panPoint.y <= 40 + SMALLHEIGHT/2 && panPoint.x >= 20 + SMALLWIDTH/2)
                    
                {
                    
                    [UIView animateWithDuration:animateDuration animations:^{
                        
                        self.firstSmallPreView.center = CGPointMake(panPoint.x, SMALLHEIGHT/2);
                        
                    }];
                    
                }
                
                else if(panPoint.y >= SCREEN_HEIGHT - SMALLHEIGHT/2 - 40 && panPoint.x >= 20 + SMALLWIDTH/2)
                    
                {
                    
                    [UIView animateWithDuration:animateDuration animations:^{
                        
                        self.firstSmallPreView.center = CGPointMake(panPoint.x, SCREEN_HEIGHT - SMALLHEIGHT/2);
                        
                    }];
                    
                }
                
                else if (panPoint.x < SMALLWIDTH/2+20 && panPoint.y > SCREEN_HEIGHT-SMALLHEIGHT/2)
                    
                {
                    
                    [UIView animateWithDuration:animateDuration animations:^{
                        
                        self.firstSmallPreView.center = CGPointMake(SMALLWIDTH/2, SCREEN_HEIGHT-SMALLHEIGHT/2);
                        
                    }];
                    
                }
                
                else
                    
                {
                    
                    CGFloat pointy = panPoint.y < SMALLHEIGHT/2 ? SMALLHEIGHT/2 :panPoint.y;
                    
                    [UIView animateWithDuration:animateDuration animations:^{
                        
                        self.firstSmallPreView.center = CGPointMake(SMALLWIDTH/2, pointy);
                        
                    }];
                    
                }
                
            }
            
            else if(panPoint.x > SCREEN_WIDTH/2)
                
            {
                
                if(panPoint.y <= 40 + SMALLHEIGHT/2 && panPoint.x < SCREEN_WIDTH - SMALLWIDTH/2-20 )
                    
                {
                    
                    [UIView animateWithDuration:animateDuration animations:^{
                        
                        self.firstSmallPreView.center = CGPointMake(panPoint.x, SMALLHEIGHT/2);
                        
                    }];
                    
                }
                
                else if(panPoint.y >= SCREEN_HEIGHT - 40 - SMALLHEIGHT/2 && panPoint.x < SCREEN_WIDTH - SMALLWIDTH/2 - 20)
                    
                {
                    
                    [UIView animateWithDuration:animateDuration animations:^{
                        
                        self.firstSmallPreView.center = CGPointMake(panPoint.x, SCREEN_HEIGHT - SMALLHEIGHT/2);
                        
                    }];
                    
                }
                
                else if (panPoint.x > SCREEN_WIDTH- SMALLWIDTH/2-20 && panPoint.y < SMALLHEIGHT/2)
                    
                {
                    
                    [UIView animateWithDuration:animateDuration animations:^{
                        
                        self.firstSmallPreView.center = CGPointMake(SCREEN_WIDTH - SMALLWIDTH/2, SMALLHEIGHT/2);
                        
                    }];
                    
                }
                
                else
                    
                {
                    
                    CGFloat pointy = panPoint.y > SCREEN_HEIGHT - SMALLHEIGHT/2 ? SCREEN_HEIGHT- SMALLHEIGHT/2 :panPoint.y;
                    
                    [UIView animateWithDuration:animateDuration animations:^{
                        
                        self.firstSmallPreView.center = CGPointMake(SCREEN_WIDTH - SMALLWIDTH/2, pointy);
                        
                    }];
                    
                }
                
            }
            
        }
        
    }
    
    - (void)changeStatus
    
    {
        
        [UIView animateWithDuration:0.5 animations:^{
            
            CGFloat x = self.firstSmallPreView.center.x < 20 + SMALLWIDTH/2 ? 0 :  self.firstSmallPreView.center.x > SCREEN_WIDTH - 20 - SMALLWIDTH/2 ? SCREEN_WIDTH : self.firstSmallPreView.center.x;
            
            CGFloat y = self.firstSmallPreView.center.y < 40 + SMALLHEIGHT/2 ? 0 : self.firstSmallPreView.center.y > SCREEN_HEIGHT - 40 - SMALLHEIGHT/2 ? SCREEN_HEIGHT : self.firstSmallPreView.center.y;
            
            //禁止停留在4个角
            
            if((x == 0 && y ==0) || (x == SCREEN_WIDTH && y == 0) || (x == 0 && y == SCREEN_HEIGHT) || (x == SCREEN_WIDTH && y == SCREEN_HEIGHT)){
                
                y = self.firstSmallPreView.center.y;
                
            }
            
            self.firstSmallPreView.center = CGPointMake(x, y);
            
        }];
        
    }
    

    第二种:任意拖动,任意停留

    - (void)changeLocation:(UIPanGestureRecognizer *)pan{
        
        self.firstSmallPreView = pan.view;
        
        CGPoint panPoint = [pan locationInView:[[UIApplication sharedApplication] keyWindow]];
        
        if(pan.state == UIGestureRecognizerStateBegan)
            
        {
            
            [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(changeStatus) object:nil];
            
        }
        
        if(pan.state == UIGestureRecognizerStateChanged)
            
        {
            
            self.firstSmallPreView.center = CGPointMake(panPoint.x, panPoint.y);
            
        }
        
        else if(pan.state == UIGestureRecognizerStateEnded)
            
        {
            
            CGFloat pointy = panPoint.y;
            
            CGFloat pointx = panPoint.x;
            
            BOOL needChangeLocation = NO;
            
            if (panPoint.y > SCREEN_HEIGHT - SMALLHEIGHT /2) {
                
                pointy = SCREEN_HEIGHT - SMALLHEIGHT /2;
                
                needChangeLocation = YES;
                
            }
            
            if (panPoint.y < SMALLHEIGHT/2) {
                
                pointy = SMALLHEIGHT/2;
                
                needChangeLocation = YES;
                
            }
            
            if (panPoint.x > SCREEN_WIDTH - SMALLWIDTH/2) {
                
                pointx = SCREEN_WIDTH - SMALLWIDTH/2;
                
                needChangeLocation = YES;
                
            }
            
            if (panPoint.x < SMALLWIDTH/2) {
                
                pointx = SMALLWIDTH/2;
                
                needChangeLocation = YES;
                
            }
            
            if (needChangeLocation) {
                
                [UIView animateWithDuration:animateDuration animations:^{
                    
                    self.firstSmallPreView.center = CGPointMake(pointx, pointy);
                    
                }];
                
            }
            
        }
        
    }
    
    

    查看原文

    相关文章

      网友评论

          本文标题:ios控件拖动改变位置的实现【转】

          本文链接:https://www.haomeiwen.com/subject/yzzryrtx.html