動畫集成中遇到的坑 —— 動畫過程中的點擊問題(一)

版本記錄

版本號 時間
V1.0 2017.12.02

前言

適當的動畫展示可以提高APP的炫酷效果,提高用戶忠誠度和粘性,但是在動畫集成過程中掌唾,不僅可能帶來性能問題,還會引起其他交互中的問題忿磅,這些都是開發(fā)人員在開發(fā)過程中比較耗時和需要注意的問題糯彬。接下來這幾篇我就說一下做各種動畫時碰到的各種性能等各種坑和問題。

問題概述

利用UIKit的UIView做動畫的時候葱她,當控件在運動的時候是不允許交互的撩扒。這一篇我們就說一下這個問題,配合具體的Demo吨些,見GitHub - 刀客傳奇却舀。


問題解決

下面我們就看一下這個問題,先寫一個動畫锤灿,具體代碼如下所示挽拔。

1. ViewController.m
#import "ViewController.h"
#import "JJGiftView.h"

@interface ViewController ()

@property (nonatomic, strong) JJGiftView *giftView;

@end

@implementation ViewController

#pragma mark - Override Base Function

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    self.view.backgroundColor = [UIColor lightGrayColor];
    self.giftView = [[JJGiftView alloc] init];
    self.giftView.backgroundColor = [UIColor redColor];
    [self.view addSubview:self.giftView];
    [self.giftView startAnimation];
}

@end
2. JJGiftView.h
#import <UIKit/UIKit.h>

@interface JJGiftView : UIView

- (void)startAnimation;

@end
3. JJGiftView.m
#import "JJGiftView.h"

@interface JJGiftView()

@property (nonatomic, strong) UIImageView *testImageView;
@property (nonatomic, assign) CGFloat giftWidth;
@property (nonatomic, assign) CGFloat giftHeight;
@property (nonatomic, assign) CGFloat startXRatio;
@property (nonatomic, assign) CGFloat startYRatio;
@property (nonatomic, assign) CGFloat pauseXRatio;
@property (nonatomic, assign) CGFloat pauseYRatio;
@property (nonatomic, assign) CGFloat endXRatio;
@property (nonatomic, assign) CGFloat endYRatio;
@property (nonatomic, assign) CGFloat startDuration;
@property (nonatomic, assign) CGFloat endDuration;
@property (nonatomic, assign) CGFloat pauseDuration;

@end

@implementation JJGiftView

#pragma mark - Override Base Function

- (instancetype)initWithFrame:(CGRect)frame
{
    if (self = [super initWithFrame:frame]) {
        UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(imageViewDidTapped:)];
        [self addGestureRecognizer:tapGesture];
    }
    return self;
}


#pragma mark - Object Private Function

- (void)startAnimation
{
    self.giftWidth = 100.0;
    self.giftHeight = 100.0;
    self.startXRatio = 0.2;
    self.startYRatio = 0.1;
    self.pauseXRatio = 0.5;
    self.pauseYRatio = 0.5;
    self.endXRatio = 0.8;
    self.endYRatio = 1.0;
    self.startDuration = 5;
    self.pauseDuration = 1;
    self.endDuration = 5;
    
    CGSize screenSize = [UIScreen mainScreen].bounds.size;
    
    //其實位置
    self.frame = CGRectMake(self.startXRatio * screenSize.width, self.startYRatio * screenSize.height, self.giftWidth, self.giftHeight);
    
    [UIView animateWithDuration:self.startDuration delay:0 options:UIViewAnimationOptionAllowUserInteraction animations:^{
        self.frame = CGRectMake(self.pauseXRatio * screenSize.width, self.pauseYRatio * screenSize.height, self.giftWidth, self.giftHeight);
    } completion:^(BOOL finished) {
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(self.pauseDuration * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            [UIView animateWithDuration:self.endDuration delay:0 options:UIViewAnimationOptionAllowUserInteraction animations:^{
                self.frame = CGRectMake(self.endXRatio * screenSize.width, self.endYRatio * screenSize.height, self.giftWidth, self.giftHeight);
            } completion:^(BOOL finished) {
                NSLog(@"動畫結束了");
            }];
        });
    }];
    
}

#pragma mark - Action && Notification

- (void)imageViewDidTapped:(UITapGestureRecognizer *)tapGesture
{
    CGFloat redValue = arc4random_uniform(255)/255.0;
    CGFloat greenValue = arc4random_uniform(255)/255.0;
    CGFloat blueValue = arc4random_uniform(255)/255.0;
    self.backgroundColor = [UIColor colorWithRed:redValue green:greenValue blue:blueValue alpha:1.0];
}

@end

下面我們就看一下效果。

這里但校,我們就發(fā)現個問題螃诅,盡管給視圖我們添加了手勢,并且做UIView動畫的時候状囱,option使用了枚舉值UIViewAnimationOptionAllowUserInteraction术裸,結果是只有在動畫在中間停止的附近時,點擊才會響應手勢亭枷,視圖變隨機色袭艺。

這是什么原因呢?

其實主要原因是叨粘,動畫執(zhí)行的過程中猾编,是layer在做動畫瘤睹,我們點擊的手勢其實已經透過本身傳遞給父視圖了,我們這個自定義view無法響應手勢答倡,解決方式就是重寫hitTest方法轰传,留住對手勢的點擊響應。

下面我們就改進一下瘪撇。

// 在自定義方法中重寫下面這個方法

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    CGPoint locationPoint = [self.layer convertPoint:point toLayer:self.layer.presentationLayer];
    CALayer *layer = self.layer.presentationLayer;
    if(CGRectContainsPoint(layer.bounds, locationPoint)){
        return self;
    }
    
    if (!self.layer.presentationLayer) {
        return [super hitTest:point withEvent:event];
    }
    return nil;
}

這樣點擊視圖获茬,就可以響應手勢。


問題效果

下面我們運行看一下效果倔既,

后記

未完恕曲,待續(xù)~~~

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市渤涌,隨后出現的幾起案子佩谣,更是在濱河造成了極大的恐慌,老刑警劉巖歼捏,帶你破解...
    沈念sama閱讀 211,348評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異笨篷,居然都是意外死亡瞳秽,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 90,122評論 2 385
  • 文/潘曉璐 我一進店門率翅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來练俐,“玉大人,你說我怎么就攤上這事冕臭∠倭溃” “怎么了?”我有些...
    開封第一講書人閱讀 156,936評論 0 347
  • 文/不壞的土叔 我叫張陵辜贵,是天一觀的道長悯蝉。 經常有香客問我,道長托慨,這世上最難降的妖魔是什么鼻由? 我笑而不...
    開封第一講書人閱讀 56,427評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮厚棵,結果婚禮上蕉世,老公的妹妹穿的比我還像新娘。我一直安慰自己婆硬,他們只是感情好狠轻,可當我...
    茶點故事閱讀 65,467評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著彬犯,像睡著了一般向楼。 火紅的嫁衣襯著肌膚如雪查吊。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,785評論 1 290
  • 那天蜜自,我揣著相機與錄音菩貌,去河邊找鬼。 笑死重荠,一個胖子當著我的面吹牛箭阶,可吹牛的內容都是我干的。 我是一名探鬼主播戈鲁,決...
    沈念sama閱讀 38,931評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼仇参,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了婆殿?” 一聲冷哼從身側響起诈乒,我...
    開封第一講書人閱讀 37,696評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎婆芦,沒想到半個月后怕磨,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 44,141評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡消约,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,483評論 2 327
  • 正文 我和宋清朗相戀三年肠鲫,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片或粮。...
    茶點故事閱讀 38,625評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡导饲,死狀恐怖,靈堂內的尸體忽然破棺而出氯材,到底是詐尸還是另有隱情渣锦,我是刑警寧澤,帶...
    沈念sama閱讀 34,291評論 4 329
  • 正文 年R本政府宣布氢哮,位于F島的核電站袋毙,受9級特大地震影響,放射性物質發(fā)生泄漏冗尤。R本人自食惡果不足惜娄猫,卻給世界環(huán)境...
    茶點故事閱讀 39,892評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望生闲。 院中可真熱鬧媳溺,春花似錦、人聲如沸碍讯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽捉兴。三九已至蝎困,卻和暖如春录语,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背禾乘。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工澎埠, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人始藕。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓蒲稳,卻偏偏與公主長得像,于是被迫代替她去往敵國和親伍派。 傳聞我的和親對象是個殘疾皇子江耀,可洞房花燭夜當晚...
    茶點故事閱讀 43,492評論 2 348

推薦閱讀更多精彩內容