Pop(Part1)

本文翻譯自Creating Simple Animations with Facebook's Pop Framework

pop-animations.jpg

本文,我們將用Facebook POP framework在應(yīng)用中來(lái)做一些好看實(shí)用的動(dòng)畫.就像其他AppCode的文章一樣,我將用實(shí)例來(lái)使你明白且掌握Pop的用法.最終我們將用它來(lái)實(shí)現(xiàn)四個(gè)簡(jiǎn)單的動(dòng)畫.
Pop是可用于iOS和OS X的拓展動(dòng)畫引擎.除了提供基本的動(dòng)畫類型,諸如Linear,Ease-In,Ease-Out,Ease-In-Ease-Out外,它還提供彈簧、衰減和自定義動(dòng)畫.

  • Spring - 創(chuàng)建力學(xué)特性動(dòng)畫反彈效果
  • Decay - 創(chuàng)建力學(xué)特性移動(dòng)物體平滑停止的效果
  • Custom - 由于引擎的可擴(kuò)展性,你可以自定義動(dòng)畫效果

Pop的基礎(chǔ)動(dòng)畫類型為POPAnimation.你可以認(rèn)為它是所有POP動(dòng)畫的抽象類或者底層類.Pop接口是NSObject的category.因此任何對(duì)象都可以使用Pop來(lái)添加動(dòng)畫.

pop-category.jpg

Pop的API對(duì)開發(fā)者相當(dāng)友好,你可以很輕松地完成逼真的擁有物理特性的效果.例如,下面就是創(chuàng)建一個(gè)具有彈簧效果的test label:

Objective-C 
POPSpringAnimation *sprintAnimation = [POPSpringAnimation animationWithPropertyNamed:kPOPViewScaleXY];
sprintAnimation.toValue = [NSValue valueWithCGPoint:CGPointMake(0.9, 0.9)];
sprintAnimation.velocity = [NSValue valueWithCGPoint:CGPointMake(2, 2)];
sprintAnimation.springBounciness = 20.f;
[self.textLabel pop_addAnimation:sprintAnimation forKey:@"springAnimation"];
swift

        let springAnimation = POPSpringAnimation(propertyNamed: kPOPViewScaleXY)
        springAnimation.toValue = NSValue(CGPoint: CGPointMake(0.9, 0.9))
        springAnimation.velocity = NSValue(CGPoint: CGPointMake(2, 2))
        springAnimation.springBounciness = 20
        textLabel.pop_addAnimation(springAnimation, forKey: "springAnimation")

非常簡(jiǎn)單吧?下面我們來(lái)編寫一個(gè)Demo.我相信當(dāng)你完成這個(gè)Demo的時(shí)候你會(huì)對(duì)Pop有一個(gè)更好的理解.

  • Pop Framework的使用
    如果你使用CocoPods,在你項(xiàng)目中的Podfile文件中添加:

pod 'pop','~>1.0'

如果沒(méi)有用Cocopods,你可以在這里下載,然后將pop文件夾拖進(jìn)你的項(xiàng)目中.選擇你的項(xiàng)目確保Build Setting下的"Other Linker Flags"選項(xiàng)下增加-lc++.

using-pop-framework-hd.jpg

還要把Header Search Path設(shè)置正確.例如,我通常將"pop"framework放在"Library"文件夾.你可以設(shè)置Header Search Path為"$(SRCROOT)/Library".當(dāng)你使用時(shí),只需在你的代碼里添加:

#import <pop/POP.h>

完成后,創(chuàng)建一個(gè)如下的僅有三行的table view:

sample-pop-app.jpg

你也可以在這里下載初始項(xiàng)目.

  • Example #1: UITableViewCell動(dòng)畫
    首先我們來(lái)創(chuàng)建一個(gè)table view cell動(dòng)畫.當(dāng)用戶點(diǎn)擊時(shí)添加一個(gè)放大效果的動(dòng)畫.手放開時(shí)使用spring動(dòng)畫來(lái)返回.
    用下面的代碼在ExampleCell.m重寫setHighlighted:方法:
- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated
{
    [super setHighlighted:highlighted animated:animated];
    if (self.highlighted) {
        POPBasicAnimation *scaleAnimation = [POPBasicAnimation animationWithPropertyNamed:kPOPViewScaleXY];
        scaleAnimation.duration = 0.1;
        scaleAnimation.toValue = [NSValue valueWithCGPoint:CGPointMake(1, 1)];
        [self.textLabel pop_addAnimation:scaleAnimation forKey:@"scalingUp"];
    } else {
        POPSpringAnimation *sprintAnimation = [POPSpringAnimation animationWithPropertyNamed:kPOPViewScaleXY];
        sprintAnimation.toValue = [NSValue valueWithCGPoint:CGPointMake(0.9, 0.9)];
        sprintAnimation.velocity = [NSValue valueWithCGPoint:CGPointMake(2, 2)];
        sprintAnimation.springBounciness = 20.f;
        [self.textLabel pop_addAnimation:sprintAnimation forKey:@"springAnimation"];
    }
}

Pop用起來(lái)相當(dāng)簡(jiǎn)單.首先選擇動(dòng)畫的類型.上面的例子中,我們選擇POPBasicAnimation作為選中時(shí)的動(dòng)畫,選擇POPSpringAnimation作為手指離開時(shí)的動(dòng)畫.類型選擇完后,就該設(shè)置動(dòng)畫的屬性了.Label上的兩個(gè)動(dòng)畫我們都設(shè)置了kPOPViewScaleXY屬性.下一步,我們?cè)O(shè)置將對(duì)象放大為CGPointMake(1,1).根據(jù)不同的動(dòng)畫類型,你需要另外增加相應(yīng)的設(shè)置,比如在spring動(dòng)畫中添加springBounciness屬性來(lái)控制彈簧的效果.最后我們將動(dòng)畫添加到text label上且給它個(gè)名字(例如springAnimation)

Pop提供了創(chuàng)建動(dòng)畫時(shí)的各種屬性,你可以通過(guò)查看POPAnimatableProperty.h來(lái)了解.

運(yùn)行程序,點(diǎn)擊cell后手指離開來(lái)查看動(dòng)畫效果.

pop-animation-1-1.gif
  • Example #2:Like Button添加動(dòng)畫
    你使用過(guò)Facebook Messager app嗎?我非常喜歡發(fā)送信息時(shí)Send/Like按鈕的動(dòng)畫.下面我用Pop來(lái)創(chuàng)建一個(gè)類似的動(dòng)畫.
    首先在storyboard里創(chuàng)建一個(gè)新的view controller.添加一個(gè)評(píng)論用的text field.將Like button放在Send button的位置.默認(rèn)Like button會(huì)顯示.當(dāng)用戶填寫評(píng)論時(shí),我們將隱藏Like button,顯示Send button,這個(gè)過(guò)程會(huì)添加動(dòng)畫效果.

facebook-send-ui-design-hd.jpg

最后將列表View controller和Facebook Like View controller通過(guò)Segue連接起來(lái).設(shè)置segue的identifier為"openFB".等會(huì)我們會(huì)編寫segue的相關(guān)代碼.
創(chuàng)建完界面后,新建一個(gè)名為FacebookButtonAnimationViewController的自定義view controller類.
接下來(lái),創(chuàng)建Like和Send按鈕的變量.另外還有text field的.你的代碼如下:

@interface FacebookButtonAnimationViewController ()
@property (weak, nonatomic) IBOutlet UIButton *likeButton;
@property (weak, nonatomic) IBOutlet UIButton *sendButton;
@property (weak, nonatomic) IBOutlet UITextField *msgTextField;
@end

在FacebookButtonAnimationViewController.h里面導(dǎo)入POP.h實(shí)現(xiàn)UITextFieldDelegate方法:

#import <UIKit/UIKit.h>
#import <pop/POP.h>
@interface FacebookButtonAnimationViewController : UIViewController <UITextFieldDelegate>
@end

在FacebookButtonAnimationViewController.m的viewDidLoad里面添加如下代碼來(lái)設(shè)置text field的代理和隱藏Send按鈕:

self.msgTextField.delegate = self;
self.sendButton.hidden = YES;

現(xiàn)在我們?cè)趯?shí)現(xiàn)方法里來(lái)處理text field,添加如下方法:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    
    NSString *comment;
    
    if (range.length == 0) {
        comment = [NSString stringWithFormat:@"%@%@", textField.text, string];
    } else {
        comment = [textField.text substringToIndex:textField.text.length - range.length];
    }
    
    if (comment.length == 0) {
        // Show Like
        [self showLikeButton];
    } else  {
        // Show Send
        [self showSendButton];
    }
    
    return YES;
}

當(dāng)用戶輸入或者刪除輸入內(nèi)容時(shí)會(huì)調(diào)用shouldChangeCharactersInRange方法.如果text field為空,將顯示Like按鈕,如果不為空,則顯示Send按鈕.
下面我們將實(shí)現(xiàn)showLikeButton和showSendButton的方法:

- (void)showSendButton {
    if (self.sendButton.isHidden) {
        self.likeButton.hidden = YES;
        self.sendButton.hidden = NO;
        
        POPSpringAnimation *sprintAnimation = [POPSpringAnimation animationWithPropertyNamed:kPOPViewScaleXY];
        
        sprintAnimation.velocity = [NSValue valueWithCGPoint:CGPointMake(8, 8)];
        sprintAnimation.springBounciness = 20.f;
        [self.sendButton pop_addAnimation:sprintAnimation forKey:@"sendAnimation"];
    }
}
 
-(void)showLikeButton {
    self.likeButton.hidden = NO;
    self.sendButton.hidden = YES;
    
    POPSpringAnimation *spin = [POPSpringAnimation animationWithPropertyNamed:kPOPLayerRotation];
    
    spin.fromValue = @(M_PI / 4);
    spin.toValue = @(0);
    spin.springBounciness = 20;
    spin.velocity = @(10);
    [self.likeButton.layer pop_addAnimation:spin forKey:@"likeAnimation"];
}

在showSendButton方法,我們隱藏Like按鈕顯示Send按鈕,給Send按鈕添加一個(gè)屬性為kPOPViewScaleXY屬性的spring動(dòng)畫.
Like按鈕有同樣的設(shè)置,但是用一個(gè)翻轉(zhuǎn)動(dòng)畫來(lái)替換spring動(dòng)畫.創(chuàng)建一個(gè)POPSpringAnimation并設(shè)置屬性值"from"和"to".Like按鈕會(huì)從45度(M_PI/4)翻轉(zhuǎn)到0度,bounciness值為20.
最后,添加下面的代碼在ExamplesListViewController.m來(lái)處理segue跳轉(zhuǎn):

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    switch (indexPath.row) {
        case 0:
            [self performSegueWithIdentifier:@"openFB" sender:self];
            break;
        case 1:
            [self performSegueWithIdentifier:@"openWrongPass" sender:self];
            break;
        case 2:
            [self performSegueWithIdentifier:@"openCustomTransition" sender:self];
            break;
            
        default:
            break;
    }
}

現(xiàn)在來(lái)測(cè)試下應(yīng)用.點(diǎn)擊Run按鈕在text filed輸入內(nèi)容來(lái)測(cè)試動(dòng)畫效果.

pop-animation-2.gif

Girl學(xué)iOS100天 第10天

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

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