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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容

  • 整体思路: 手指移动,按钮跟着移动.按钮跟着手指移动.移动时底部有一个圆, 根据上面的大圆按钮拖动的距离,小圆的半...
    翻滚的企鹅阅读 677评论 0 0
  • 按钮button自定义button设置圆角半径cornerRadius取消高亮状态重写setHighlighted...
    彼岸的黑色曼陀罗阅读 399评论 0 0
  • 动画分析 当前控件既可以显示图片,有可以显示文字,那么我们就可以通过按钮来最为当前的控件. 当拖动控件,当前控件尺...
    亡灵诅咒阅读 485评论 0 2
  • Core Animation Core Animation,中文翻译为核心动画,它是一组非常强大的动画处理API,...
    45b645c5912e阅读 3,013评论 0 21
  • 眼前飘落正秋黄,倚晴窗,独相望。千里归鸿,字字送离伤。月似故人人似月,风弄影,水流光。 披衣不觉更添凉,酒生香,引...
    雪窗_武立之阅读 182评论 0 7