AFViewShaker——為視圖添加抖動(dòng)效果

                            ?????? 

以下內(nèi)容來源于官方源碼颖低、 README 文檔歧蕉、測(cè)試 Demo或個(gè)人使用總結(jié) 夫嗓!

AFViewShaker

[圖片上傳失敗...(image-a1b1a5-1510132021807)]
[圖片上傳失敗...(image-914a1b-1510132021807)]
[圖片上傳失敗...(image-3b1e4c-1510132021807)]

About

AFViewShaker 實(shí)現(xiàn)了簡(jiǎn)單的 UIView 磚塊抖動(dòng)效果裹唆。

使用

為一個(gè)視圖創(chuàng)建抖動(dòng)效果
AFViewShaker * viewShaker = [[AFViewShaker alloc] initWithView:self.formView];
為多個(gè)視圖創(chuàng)建抖動(dòng)效果
NSArray * allFields = @[self.emailField, self.passwordField];
AFViewShaker * viewShaker = [[AFViewShaker alloc] initWithViewsArray:allFields];
使用默認(rèn)參數(shù)抖動(dòng)
// 抖動(dòng) AFViewShaker 實(shí)例中的所有視圖
[self.viewShaker shake];

// 抖動(dòng)指定的視圖
[[[AFViewShaker alloc] initWithView:self.allButtons[0]] shake];
使用附帶參數(shù)配置抖動(dòng)
[self.viewShaker shakeWithDuration:0.6 completion:^{
    NSLog(@"Hello World!");
}];

源碼

AFViewShaker.h
// 2個(gè)初始化方法
- (instancetype)initWithView:(UIView *)view;
- (instancetype)initWithViewsArray:(NSArray *)viewsArray;

// 2個(gè)抖動(dòng)方法
- (void)shake;
- (void)shakeWithDuration:(NSTimeInterval)duration completion:(void (^)())completion;
AFViewShaker.m
//
//  AFViewShaker
//  AFViewShaker
//
//  Created by Philip Vasilchenko on 03.12.13.
//  Copyright (c) 2014 okolodev. All rights reserved.
//

#import "AFViewShaker.h"

// 默認(rèn)延時(shí)
static NSTimeInterval const kAFViewShakerDefaultDuration = 0.5;
static NSString * const kAFViewShakerAnimationKey = @"kAFViewShakerAnimationKey";

#if __IPHONE_OS_VERSION_MAX_ALLOWED < 100000
// CAAnimationDelegate is not available before iOS 10 SDK
@interface AFViewShaker ()
#else
@interface AFViewShaker () <CAAnimationDelegate>
#endif

/** 包含視圖的數(shù)組 */
@property (nonatomic, strong) NSArray * views;
/** 完成動(dòng)畫 */
@property (nonatomic, assign) NSUInteger completedAnimations;
/** 完成后調(diào)用 Block 對(duì)象 */
@property (nonatomic, copy) void (^completionBlock)();

@end


@implementation AFViewShaker

- (instancetype)initWithView:(UIView *)view {
    // 這里只是調(diào)用了指定初始化方法究珊,往數(shù)組里扔了一個(gè) View
    return [self initWithViewsArray:@[view]];
}

// 指定初始化方法
- (instancetype)initWithViewsArray:(NSArray *)viewsArray {
    self = [super init];
    if (self) {
        self.views = viewsArray;
    }
    return self;
}


#pragma mark - Public methods

- (void)shake {
    // 這里調(diào)用了下面的默認(rèn)指定動(dòng)畫方法瓤摧,傳入的延時(shí)是全局靜態(tài)變量
    [self shakeWithDuration:kAFViewShakerDefaultDuration completion:nil];
}

// 指定動(dòng)畫方法
- (void)shakeWithDuration:(NSTimeInterval)duration completion:(void (^)())completion {
    self.completionBlock = completion;
    for (UIView * view in self.views) {
        // 遍歷視圖竿裂,為每個(gè)視圖添加動(dòng)畫
        [self addShakeAnimationForView:view withDuration:duration];
    }
}


#pragma mark - Shake Animation

- (void)addShakeAnimationForView:(UIView *)view withDuration:(NSTimeInterval)duration {
    CAKeyframeAnimation * animation = [CAKeyframeAnimation animationWithKeyPath:@"transform.translation.x"];
    CGFloat currentTx = view.transform.tx;
    
    animation.delegate = self;
    animation.duration = duration;
    // 偏移量
    animation.values = @[@(currentTx),
                         @(currentTx + 10),
                         @(currentTx - 8),
                         @(currentTx + 8),
                         @(currentTx - 5),
                         @(currentTx + 5),
                         @(currentTx)];
    // 動(dòng)畫時(shí)間
    animation.keyTimes = @[@(0), @(0.225), @(0.425), @(0.6), @(0.75), @(0.875), @(1)];
    animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
    [view.layer addAnimation:animation forKey:kAFViewShakerAnimationKey];
}


#pragma mark - CAAnimation Delegate

- (void)animationDidStop:(CAAnimation *)animation finished:(BOOL)flag {
    self.completedAnimations += 1;
    if (self.completedAnimations >= self.views.count) {
        self.completedAnimations = 0;
        if (self.completionBlock) {
            // 遍歷視圖,當(dāng)所有視圖的動(dòng)畫完成以后就調(diào)用 Block 對(duì)象
            self.completionBlock();
        }
    }
}


@end

  • 配合 MBProgressHUD 使用:
//--------------------------------
// .h
/**
 輸入文本框抖動(dòng)效果
 
 @param view 需要抖動(dòng)的文本框視圖
 @param text 抖動(dòng)結(jié)束后顯示的 HUD 提示
 @param HUDView 呈現(xiàn) HUD 的視圖
 */
- (void) shakeWithView:(UIView *)view
               HUDText:(NSString *)text
             addToView:(UIView *)HUDView;

//--------------------------------
// .m
- (void) shakeWithView:(UIView *)view
               HUDText:(NSString *)text
             addToView:(UIView *)HUDView {
    AFViewShaker *viewShaker = [[AFViewShaker alloc] initWithView:view];
    [viewShaker shakeWithDuration:KAFViewShakerDuration
                       completion:^{
        [MBProgressHUD hql_showTextHUD:text toView:HUDView];
    }];
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末照弥,一起剝皮案震驚了整個(gè)濱河市腻异,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌这揣,老刑警劉巖悔常,帶你破解...
    沈念sama閱讀 222,627評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異给赞,居然都是意外死亡机打,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門片迅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來残邀,“玉大人,你說我怎么就攤上這事柑蛇〗嬲酰” “怎么了?”我有些...
    開封第一講書人閱讀 169,346評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵耻台,是天一觀的道長(zhǎng)空免。 經(jīng)常有香客問我,道長(zhǎng)粘我,這世上最難降的妖魔是什么鼓蜒? 我笑而不...
    開封第一講書人閱讀 60,097評(píng)論 1 300
  • 正文 為了忘掉前任痹换,我火速辦了婚禮,結(jié)果婚禮上都弹,老公的妹妹穿的比我還像新娘娇豫。我一直安慰自己,他們只是感情好畅厢,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,100評(píng)論 6 398
  • 文/花漫 我一把揭開白布冯痢。 她就那樣靜靜地躺著,像睡著了一般框杜。 火紅的嫁衣襯著肌膚如雪浦楣。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,696評(píng)論 1 312
  • 那天咪辱,我揣著相機(jī)與錄音振劳,去河邊找鬼。 笑死油狂,一個(gè)胖子當(dāng)著我的面吹牛历恐,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播专筷,決...
    沈念sama閱讀 41,165評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼弱贼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了磷蛹?” 一聲冷哼從身側(cè)響起吮旅,我...
    開封第一講書人閱讀 40,108評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎味咳,沒想到半個(gè)月后庇勃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,646評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡莺葫,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,709評(píng)論 3 342
  • 正文 我和宋清朗相戀三年匪凉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片捺檬。...
    茶點(diǎn)故事閱讀 40,861評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡再层,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出堡纬,到底是詐尸還是另有隱情聂受,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布烤镐,位于F島的核電站蛋济,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏炮叶。R本人自食惡果不足惜碗旅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,196評(píng)論 3 336
  • 文/蒙蒙 一渡处、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧祟辟,春花似錦医瘫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至吼具,卻和暖如春僚纷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背拗盒。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工怖竭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人陡蝇。 一個(gè)月前我還...
    沈念sama閱讀 49,287評(píng)論 3 379
  • 正文 我出身青樓侵状,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親毅整。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,860評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容