iOS黑科技【動(dòng)畫特效篇-4】 浮動(dòng)按鈕--MovableButton

iOS黑科技【動(dòng)畫特效篇】第四期

本期帶來(lái)一款實(shí)用性強(qiáng)同時(shí)又具備高B格的控件--浮動(dòng)按鈕,實(shí)現(xiàn)原理也不復(fù)雜,短短幾行代碼就能帶來(lái)非常出色的用戶體驗(yàn)!

movableButton.gif

git來(lái)一波,和系統(tǒng)button創(chuàng)建方法一模一樣,簡(jiǎn)單實(shí)用:
https://github.com/XMDashen/XMMovableButtonDemo.git

原理解析:

浮動(dòng)按鈕和系統(tǒng)按鈕的最大區(qū)別就是一個(gè)可以移動(dòng),而另一個(gè)不可以...囧

所以要實(shí)現(xiàn)按鈕的移動(dòng),直接繼承UIButton,在button監(jiān)聽觸摸移動(dòng)事件里實(shí)現(xiàn)就可以啦

基本思路是將前后兩次觸摸移動(dòng)的偏移量設(shè)置到button上,如果沒有移動(dòng)偏移量則判斷為點(diǎn)擊,調(diào)用點(diǎn)擊事件

//移動(dòng)時(shí)
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    
    [super touchesMoved:touches withEvent:event];
    
    UITouch * touch = [touches anyObject];
    
    //本次觸摸點(diǎn)
    CGPoint current = [touch locationInView:self];
    
    //上次觸摸點(diǎn)
    CGPoint previous = [touch previousLocationInView:self];
    
    CGPoint center = self.center;
    
    //中心點(diǎn)移動(dòng)觸摸移動(dòng)的距離
    center.x += current.x - previous.x;
    center.y += current.y - previous.y;
    
    //限制移動(dòng)范圍
    CGFloat screenWidth  = [UIScreen mainScreen].bounds.size.width;
    CGFloat screenHeight = [UIScreen mainScreen].bounds.size.height;
    
    CGFloat xMin = self.frame.size.width  * 0.5f;
    CGFloat xMax = screenWidth  - xMin;
    
    CGFloat yMin = self.frame.size.height * 0.5f+64;
    CGFloat yMax = screenHeight - self.frame.size.height * 0.5f - 49;
    
    if (center.x > xMax) center.x = xMax;
    if (center.x < xMin) center.x = xMin;
    
    if (center.y > yMax) center.y = yMax;
    if (center.y < yMin) center.y = yMin;
    
    self.center = center;
    
    //移動(dòng)距離大于0.5才判斷為移動(dòng)了(提高容錯(cuò)性)
    if (current.x-previous.x>=0.5 || current.y - previous.y>=0.5) {
        
        self.isMoved = YES;
    }
}

注意要限制button的移動(dòng)范圍不要超出屏幕拉不回來(lái)了。

用isMoved來(lái)記錄button的移動(dòng)狀態(tài),判斷是否移動(dòng),為了提高容錯(cuò)性將移動(dòng)距離判定為0.5用戶體驗(yàn)較好(否則有時(shí)點(diǎn)擊會(huì)產(chǎn)生微小的移動(dòng),判斷為移動(dòng)導(dǎo)致點(diǎn)擊失效,用戶會(huì)不高興的(??ˇ?ˇ??))。

//是否移動(dòng)
@property (nonatomic,assign) BOOL isMoved;
//移動(dòng)結(jié)束時(shí)
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    
    if (!self.isMoved) {
        //如果沒有移動(dòng),則調(diào)用父類方法,觸發(fā)button的點(diǎn)擊事件
        [super touchesEnded:touches withEvent:event];
    }
    self.isMoved = NO;
    
    //回到一定范圍
//    CGFloat screenWidth = [UIScreen mainScreen].bounds.size.width;
//    CGFloat           x = self.frame.size.width * 0.5f;
//    
//    [UIView animateWithDuration:0.25f animations:^{
//        CGPoint center = self.center;
//        center.x = self.center.x > screenWidth * 0.5f ? screenWidth - x : x;
//        self.center = center;
//    }];
    
    //關(guān)閉高亮狀態(tài)
    [self setHighlighted:NO];
}

中間注釋掉的實(shí)現(xiàn)的是button自動(dòng)滾到屏幕邊沿的功能(如阿里旺旺的懸浮球),靠近屏幕哪邊就會(huì)自動(dòng)滾到屏幕那邊,不會(huì)影響用戶屏幕中央的操作。

注意關(guān)閉按鈕高亮,否則點(diǎn)擊后會(huì)很難看,影響用戶體驗(yàn)。

這一期就到這里了,親們有什么意見和問題記得及時(shí)反饋哦,喜歡的話點(diǎn)個(gè)關(guān)注給個(gè)贊(づ ̄3 ̄)づ╭?~
我們下期再會(huì)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 14,122評(píng)論 1 92
  • Swift版本點(diǎn)擊這里歡迎加入QQ群交流: 594119878最新更新日期:18-09-17 About A cu...
    ylgwhyh閱讀 26,025評(píng)論 7 249
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,211評(píng)論 4 61
  • 我愿化身石橋,受五百年風(fēng)吹,五百年雨打,五百年日曬,只求她從橋上走過。 電影開始,用水墨畫交代了故事背景:羅摩遺體...
    池近近閱讀 8,706評(píng)論 3 6
  • 今天6點(diǎn)左右,我又出門了,像現(xiàn)在這樣,每天的生活已經(jīng)有了一個(gè)大體的模式,起床,吃早餐,看書,吃午餐,午睡,出門,回...
    陶一一閱讀 236評(píng)論 0 0

友情鏈接更多精彩內(nèi)容