QQ粘性布局


#import

@interfaceBageValueButton :UIButton

@end



#import "BageValueButton.h"

@interface BageValueButton ()

@property (nonatomic, strong) CAShapeLayer *shapL;

@property (nonatomic, strong) UIView *smallCircle;

@property (nonatomic, strong) UIView *bigCircle;

@end

@implementationBageValueButton

-(CAShapeLayer *)shapL{

    if(_shapL==nil) {

        CAShapeLayer *shapL = [CAShapeLayer layer];

        [self.superview.layerinsertSublayer:shapLatIndex:0];

        shapL.fillColor = [UIColor redColor].CGColor;

        _shapL= shapL;

    }

    return _shapL;

}

-(instancetype)initWithFrame:(CGRect)frame{

    self= [superinitWithFrame:frame];

    if(self) {

        [selfsetUp];

    }

    return self;

}

-(void)awakeFromNib{

    [selfsetUp];


    //添加手势

    UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)];

    [self addGestureRecognizer:pan];

}

-(void)pan:(UIPanGestureRecognizer *)pan{

    //拖动

    CGPointtransP = [pantranslationInView:self];


    //transform并没有修改center,它修改的是frame

    //self.transform = CGAffineTransformTranslate(self.transform, transP.x, transP.y);

    CGPointcenter =self.center;

    center.x+= transP.x;

    center.y+= transP.y;

    self.center= center;


    //复位

    [pansetTranslation:CGPointZero inView:self];


    CGFloat distance = [self distanceWithSmallCircle:self.smallCircle bigCircle:self];


    //让小圆半径根据距离的增大,半径在减小

    CGFloat smallR = self.bounds.size.width * 0.5;

    smallR -= distance /10.0;

    self.smallCircle.bounds=CGRectMake(0,0, smallR *2, smallR *2);

    self.smallCircle.layer.cornerRadius = smallR;


    UIBezierPath *path = [self pathWithSmallCircle:self.smallCircle BigCircle:self];


    //形状图层

    if(self.smallCircle.hidden==NO) {

        self.shapL.path= path.CGPath;

    }



    if(distance >60) {

        //让小圆隐藏,让路径隐藏

        self.smallCircle.hidden=YES;

        [self.shapL removeFromSuperlayer];

    }


    if (pan.state == UIGestureRecognizerStateEnded) {

        //判断结束时,距离是否大于60,

        //大于60,让按钮消失,


        if(distance <60) {

            //小于60复位

            [self.shapL removeFromSuperlayer];

            self.center=self.smallCircle.center;


            self.smallCircle.hidden=NO;

        }else{

            //播放一个动画消失

            UIImageView*imageView = [[UIImageViewalloc]initWithFrame:self.bounds];

            NSMutableArray*imageArray = [NSMutableArrayarray];

            for(inti =0; i <8; i ++) {

                UIImage*image = [UIImageimageNamed:[NSStringstringWithFormat:@"name%d",i +1]];

                [imageArrayaddObject:image];

            }

            imageView.animationImages= imageArray;

            imageView.animationDuration=1;

            [imageViewstartAnimating];


            [selfaddSubview:imageView];


            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

                [selfremoveFromSuperview];

            });

        }


    }

}

//给定两个圆,细述一个不规则的路径

-(UIBezierPath*)pathWithSmallCircle:(UIView*)smallCircle BigCircle:(UIView*)bigCircle{


    CGFloatx1 = smallCircle.center.x;

    CGFloaty1 = smallCircle.center.y;


    CGFloatx2 = bigCircle.center.x;

    CGFloaty2 = bigCircle.center.y;


    CGFloatd = [selfdistanceWithSmallCircle:smallCirclebigCircle:bigCircle];


    if(d <=0) {

        returnnil;

    }


    CGFloatcosθ = (y2 - y1) / d;

    CGFloatsinθ = (x2 - x1) / d;


    CGFloatr1 = smallCircle.bounds.size.width*0.5;

    CGFloatr2 = bigCircle.bounds.size.width*0.5;


    //描述点

    //A点

    CGPointpointA =CGPointMake(x1 - r1 * cosθ, y1 + r1 * sinθ);

    CGPointpointB =CGPointMake(x1 + r1 * cosθ, y1 - r1 * sinθ);

    CGPointpointC =CGPointMake(x2 + r2 * cosθ, y2 - r2 * sinθ);

    CGPointpointD =CGPointMake(x2 - r2 * cosθ, y2 + r2 * sinθ);

    CGPointpoint0 =CGPointMake(pointA.x+ d *0.5* sinθ, pointA.y + d *0.5* cosθ);

    CGPointpointP =CGPointMake(pointB.x+ d *0.5* sinθ, pointB.y + d *0.5* cosθ);


    UIBezierPath *path = [UIBezierPath bezierPath];


    //AB

    [pathmoveToPoint:pointA];

    [pathaddLineToPoint:pointB];

    //BC(曲线)

    [pathaddQuadCurveToPoint:pointC controlPoint:pointP];

    //CD

    [pathaddLineToPoint:pointD];

    //DA(曲线)

    [pathaddQuadCurveToPoint:pointA controlPoint:point0];


    returnpath;

}

-(void)setUp{


    //设置圆角

    self.layer.cornerRadius = self.bounds.size.width * 0.5;

    //设置形状的填充颜色

    [self setBackgroundColor:[UIColor redColor]];

    [self setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];

    self.titleLabel.font = [UIFont systemFontOfSize:12];


    //添加小圆

    UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)];

    [self addGestureRecognizer:pan];


    //添加

    UIView*smallCircle = [[UIViewalloc]init];

    smallCircle.frame=self.frame;

    smallCircle.backgroundColor = self.backgroundColor;

    smallCircle.layer.cornerRadius = self.layer.cornerRadius;

    self.smallCircle= smallCircle;

    //把一个UIView添加到指定位置

    [self.superview insertSubview:smallCircle belowSubview:self];


}

//取消高亮状态

-(void)setHighlighted:(BOOL)highlighted{


}

//求两个圆之间的距离

-(CGFloat)distanceWithSmallCircle:(UIView*)smallCircle bigCircle:(UIView*)bigCircle{


    //x轴方法向的偏移量

    CGFloatoffsetX = bigCircle.center.x- smallCircle.center.x;

    //y轴方法向的偏移量

    CGFloatoffsetY = bigCircle.center.y- smallCircle.center.y;


    returnsqrt(offsetX * offsetX + offsetY * offsetY);

}

@end

你可能感兴趣的:(QQ粘性布局)