美文网首页iOS 开发 iOS Developer
可拖动的伸缩UIButton

可拖动的伸缩UIButton

作者: jett_yu | 来源:发表于2016-08-31 10:57 被阅读197次

    前段时间总监有个需求让我实现,就是可伸缩的UIButton

    比如:

    伸缩UIButton

    这个很简单没有什么好说的。
    主要做法就是计算好view的宽和Button的X.
    做完之后总监不满意,认为既然可以伸缩,那么就应该也可以拖动!

    好了,又要费点事儿了。
    所以我们给UIButton 添加一个扩展,在扩展文件里,我们重写UIResponder的方法。

    - (void)touchesBegan:(NSSet)touches withEvent:(UIEvent)event;**

    - (void)touchesMoved:(NSSet)touches withEvent:(UIEvent)event;**

    -(void)touchesEnded:(NSSet)touches withEvent:(UIEvent)event;**

    我们分别要重写这三个方法,具体三个方法的实现:

    touchesBegan:

    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
    {
        [super touchesBegan:touches withEvent:event];
        self.highlighted = YES;
        if (![objc_getAssociatedObject(self, DragEnableKey) boolValue]) {
            return;
        }
        begincenter=self.superview.center;
        UITouch *touch = [touches anyObject];
        
        beginPoint = [touch locationInView:self.superview];
    }
    

    touchesMoved:

    - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
    {
        self.highlighted = NO;
        [super touchesMoved:touches withEvent:event];
        if (![objc_getAssociatedObject(self, DragEnableKey) boolValue]) {
            return;
        }
        
        UITouch *touch = [touches anyObject];
        
        CGPoint nowPoint = [touch locationInView:self];
        
        float offsetX = nowPoint.x - beginPoint.x;
        float offsetY = nowPoint.y - beginPoint.y;
        
        self.superview.center = CGPointMake(self.superview.center.x + offsetX, self.superview.center.y + offsetY);
    }
    

    touchesEnded:

    -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
    {
    
    if (self.superview && [objc_getAssociatedObject(self,AdsorbEnableKey) boolValue] ) {
        if (self.highlighted) {
            [self sendActionsForControlEvents:UIControlEventTouchDown];
            self.highlighted = NO;
        }
        
        CGPoint nowPoint = self.superview.center;
        
        
        float offsetX = nowPoint.x - begincenter.x;
        float offsetY = nowPoint.y - begincenter.y;
    
        
        if (fabsf(offsetX)<5 && fabsf(offsetY)<5) {
            [super touchesEnded:touches withEvent:event];
            
        }
        
        
        float marginLeft = self.superview.frame.origin.x;
        float marginRight = self.superview.superview.frame.size.width - self.superview.frame.origin.x - self.superview.frame.size.width;
        float marginTop = self.superview.frame.origin.y;
        float marginBottom = self.superview.superview.frame.size.height - self.superview.frame.origin.y - self.superview.frame.size.height;
        
        [UIView animateWithDuration:0.125 animations:^(void){
            if (marginTop<60) {
                self.superview.frame = CGRectMake(marginLeft<marginRight?marginLeft<PADDING?PADDING:self.superview.frame.origin.x:marginRight<PADDING?self.superview.superview.frame.size.width -self.superview.frame.size.width-PADDING:self.superview.frame.origin.x,
                                        PADDING,
                                        self.superview.frame.size.width,
                                        self.superview.frame.size.height);
                
                
            }
            else if (marginBottom<60) {
                
                self.superview.frame = CGRectMake(marginLeft<marginRight?marginLeft<PADDING?PADDING:self.superview.frame.origin.x:marginRight<PADDING?self.superview.superview.frame.size.width -self.superview.frame.size.width-PADDING:self.superview.frame.origin.x,
                                        self.superview.superview.frame.size.height - self.superview.frame.size.height-PADDING,
                                        self.superview.frame.size.width,
                                        self.superview.frame.size.height);
                
            }
            else {
                self.superview.frame = CGRectMake(marginLeft<marginRight?PADDING:self.superview.superview.frame.size.width - self.superview.frame.size.width-PADDING,
                                        self.superview.frame.origin.y,
                                        self.superview.frame.size.width,
                                        self.superview.frame.size.height);
                
            }
        }];
    }else{
        [super touchesEnded:touches withEvent:event];
        
    }
    }
    

    最后要实现的效果大概就是这样。

    最后附上gitHub链接,希望能给有同样需求的你们带来帮助。

    Demo点我下载~

    相关文章

      网友评论

        本文标题:可拖动的伸缩UIButton

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