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

#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);
                
            }];
            
        }
        
    }
    
}

 

posted @ 2022-07-30 11:49  LiuZX_贤  阅读(193)  评论(0编辑  收藏  举报