(iOS)實現(xiàn)QQ未讀消息數(shù)量彈性按鈕動畫

好久沒有更新過博客了,最近公司比較忙,老項目需要換Swift重寫,用了一周左右的時間學習了下Swift,目前正在改寫舊項目,個人對Swift愛不釋手,感覺取代OC就這一兩年內的事,不過老的iOS開發(fā)者也不需要擔心,會OC轉Swift真的像切菜一樣簡單,只需要熟悉下語法就可以,函數(shù)和OC的基本差不多,基本看個4,5個小時就可以直接上手Swift開發(fā)項目,中間不熟悉的寫法只需要百度下即可,相信朋友們都會喜歡上Swift的,嘮叨的有點跑題了,廢話不多說,直接上代碼!

由于公司項目的需求,想要達到和手機QQ未讀信息一樣的動畫效果,周末試著寫了一下,效果基本實現(xiàn)了,不過還有些Bug正在修改中,代碼用OC寫的,如果需要Swift代碼的朋友可以發(fā)個私信給我,等我完善玩Swift代碼發(fā)給你,先發(fā)一下效果圖給大家參考下

效果gif
效果gif

效果gif
效果gif

效果gif
效果gif
  • 先說一下大體的思路吧,控件是繼承Button寫的,并且在button的下面添加一個小的圓,給button添加拖拽手勢,根據(jù)倆個圓的中心點算出拉動的距離,拖動的距離越大小圓的半徑越小(勾股定理)

  • 這個動畫最大的難點在畫倆個畫出倆個圓之間的不規(guī)則的矩形,通過下面的這個公式可以計算出倆個圓的直徑上的四個點和中間的2個點的貝塞爾控制點的point,參照下面圖片


    根據(jù)倆個圓的中心點算出6個點的坐標
    根據(jù)倆個圓的中心點算出6個點的坐標
  • 傳入倆個圓的中心點,計算出6個點的坐標,用UIBezierPath畫出6個點,代碼如下

   - (UIBezierPath *)pathWithBigCirCleView:(UIView *)bigCirCleView  smallCirCleView:(UIView *)smallCirCleView
{
    CGPoint bigCenter = bigCirCleView.center;
    CGFloat x2 = bigCenter.x;
    CGFloat y2 = bigCenter.y;
    CGFloat r2 = bigCirCleView.bounds.size.width / 2;
    
    CGPoint smallCenter = smallCirCleView.center;
    CGFloat x1 = smallCenter.x;
    CGFloat y1 = smallCenter.y;
    CGFloat r1 = smallCirCleView.bounds.size.width / 2;
    
    // 獲取圓心距離
    CGFloat d = [self pointToPoitnDistanceWithPoint:self.samllCircleView.center potintB:self.center];
    CGFloat sinθ = (x2 - x1) / d;
    CGFloat cosθ = (y2 - y1) / d;
    
    // 坐標系基于父控件
    CGPoint pointA = CGPointMake(x1 - r1 * cosθ , y1 + r1 * sinθ);
    CGPoint pointB = CGPointMake(x1 + r1 * cosθ , y1 - r1 * sinθ);
    CGPoint pointC = CGPointMake(x2 + r2 * cosθ , y2 - r2 * sinθ);
    CGPoint pointD = CGPointMake(x2 - r2 * cosθ , y2 + r2 * sinθ);
    CGPoint pointO = CGPointMake(pointA.x + d / 2 * sinθ , pointA.y + d / 2 * cosθ);
    CGPoint pointP = CGPointMake(pointB.x + d / 2 * sinθ , pointB.y + d / 2 * cosθ);
    
    UIBezierPath *path = [UIBezierPath bezierPath];
    // A
    [path moveToPoint:pointA];
    // AB
    [path addLineToPoint:pointB];
    // 繪制BC曲線
    [path addQuadCurveToPoint:pointC controlPoint:pointP];
    // CD
    [path addLineToPoint:pointD];
    // 繪制DA曲線
    [path addQuadCurveToPoint:pointA controlPoint:pointO];
    
    return path;
}
  • 由于是在button內部實現(xiàn)的代碼,所以不可以直接在drawRect中直接繪制,超出范圍的會被裁剪掉,需要CAShapeLayer來繪制
 self.shapeLayer.path = [self pathWithBigCirCleView:self 
smallCirCleView:_samllCircleView].CGPath;
  • 從寫按鈕的setHighlighted:方法,在里面實現(xiàn)長按button是大圓左右晃動的效果
 - (void)setHighlighted:(BOOL)highlighted
{
    [self.layer removeAnimationForKey:@"shake"];

    //長按左右晃動的幅度大小
    CGFloat shake = 10;
    
    CAKeyframeAnimation *keyAnim = [CAKeyframeAnimation animation];
    keyAnim.keyPath = @"transform.translation.x";
    keyAnim.values = @[@(-shake), @(shake), @(-shake)];
    keyAnim.removedOnCompletion = NO;
    keyAnim.repeatCount = MAXFLOAT;
    //左右晃動一次的時間
    keyAnim.duration = 0.3;
    [self.layer addAnimation:keyAnim forKey:@"shake"];
}
  • 給按鈕本身添加一個點擊事件,TouchUpInside時候銷毀所有的對象,播放消失動畫

  • 設置大圓距離小圓最大的距離,根據(jù)手勢的staus,在拖拽的函數(shù)里判斷距離是否超過最大的距離,超過最大距離時候移除shapeLayer隱藏小圓

  • 還有一些細節(jié)在此就不一一列舉了

我自己大體的思路就是如此

下面是OC的源碼,希望小手能順便點一下右上角的??Star
如果朋友們有什么問題可以直接留言,我會看到回復
代碼下載

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,818評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,185評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,656評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,647評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,446評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,951評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,041評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,189評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,718評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,602評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,800評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,316評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,045評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,419評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,671評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,420評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,755評論 2 371

推薦閱讀更多精彩內容

  • 發(fā)現(xiàn) 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,151評論 4 61
  • 羨慕所有在坦然的愛里長大的小孩 像我這種從小到大自己跌倒自己爬起來自己哭完自己擦眼淚的人 別人給得多一點就會惶恐不...
    眼嫂閱讀 354評論 0 0
  • 去年認識了一個年輕姑娘,長相清秀,身材窈窕,身邊不乏小伙子的追求,但是她卻都不放在心上。 一次外出短期培訓的機會,...
    瑪格麗特MM閱讀 702評論 3 6
  • 七月初七,月未曾滿,于是星星很亮。 一夏的溽熱,秋開始有點小意思的時候,七夕充滿性感和溫柔的款款而來。 是愛情太短...
    德魯伊_Druid閱讀 386評論 0 3
  • 1. 初見 百花盛惠空不就,蔭下清潭好個秋。 曾許暖溪送折柳,相忘何作初見留。 2. 再見 粉面青黛妝已朽,拾憶恨...
    宮主閱讀 266評論 0 0