iOS點擊查看大圖的動畫效果

對于圖片來說,除了表情包,幾乎都會被點擊查看大圖。今天就講解一個查看和收起大圖的動畫效果,先直接看效果圖:

image

如圖所示,最開始是一個小圖,點擊小圖可以查看大圖。大圖會從小圖的位置和大小“彈”出來,同時背景變成半透明的陰影。點擊大圖或者陰影后,收起大圖,同樣地彈回到小圖去,同時去掉陰影背景,就像是一張圖片在伸大縮小一樣。

現在看看這是怎么實現的。在思考一個動畫的實現方法時,把動畫的動作進行分解然后再一個個去思考怎么實現是一個好的習慣,我們稍微分解一下,這個動畫在顯示大圖和收起大圖的時候做了這些事情:

  • 打開時先顯示一個半透明的陰影背景;
  • 然后顯示一個逐漸變大的圖片,直到撐到屏幕的邊界;
  • 收起時先讓陰影背景消失;
  • 然后將圖片逐漸收小到小圖原本的大小。

這樣看其實還蠻簡單的,下面看代碼怎么實現。

首先我們定義三個屬性,因為我們需要在多個方法中調用,所以定義為類的@property:

@property (nonatomic, strong) UIImageView *smallImageView;// 小圖視圖
@property (nonatomic, strong) UIImageView *bigImageView;// 大圖視圖
@property (nonatomic, strong) UIView *bgView;// 陰影視圖

然后我們將小圖片直接添加到界面上去:

- (void)viewDidLoad {
    [super viewDidLoad];

    // 小圖
    self.smallImageView = [[UIImageView alloc] initWithFrame:CGRectMake((SCREENWIDTH - 100)/2, (SCREENHEIGHT - 100)/2, 100, 100)];
    self.smallImageView.image = [UIImage imageNamed:@"icon"];
    // 添加點擊響應
    self.smallImageView.userInteractionEnabled = YES;
    UITapGestureRecognizer *imageTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(viewBigImage)];
    [self.smallImageView addGestureRecognizer:imageTap];
    [self.view addSubview:self.smallImageView];
}

注意這里我在設置小圖的大小時用到了兩個事先設好的常量:屏幕的高和寬,這樣就會根據手機的屏幕大小來保證圖片始終是居中顯示的,關于這兩個常量,可以查看我這篇博客:iOS獲取屏幕寬高、設備型號、系統版本信息

好現在小圖已經添加到界面上了,我們也給小圖添加了響應點擊的方法,只需要在響應方法中實現動畫就可以了。但是在這之前,我們先來完成大圖片和陰影背景的初始化:

// 大圖視圖
- (UIImageView *)bigImageView {
    if (nil == _bigImageView) {
        _bigImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, (SCREENHEIGHT - SCREENWIDTH) / 2, SCREENWIDTH, SCREENWIDTH)];
        [_bigImageView setImage:self.smallImageView.image];
        // 設置大圖的點擊響應,此處為收起大圖
        _bigImageView.userInteractionEnabled = YES;
        UITapGestureRecognizer *imageTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissBigImage)];
        [_bigImageView addGestureRecognizer:imageTap];
    }
    return _bigImageView;
}

// 陰影視圖
- (UIView *)bgView {
    if (nil == _bgView) {
        _bgView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, SCREENWIDTH, SCREENHEIGHT)];
        _bgView.backgroundColor = [UIColor colorWithWhite:0 alpha:0.5];
        // 設置陰影背景的點擊響應,此處為收起大圖
        _bgView.userInteractionEnabled = YES;
        UITapGestureRecognizer *bgTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissBigImage)];
        [_bgView addGestureRecognizer:bgTap];
    }
    return _bgView;
}

可以看到我們單獨使用了兩個方法來初始化大圖和陰影背景,大圖的大小設為了垂直居中,寬度正好與屏幕一致,高度與寬度相同,是個正方形。陰影背景則是占據整個屏幕。同時,我也設置了兩個視圖的點擊相應方法,都是收起大圖的動畫方法,我們之后再去實現。現在,我們可以來著手實現顯示大圖的動畫了。

// 顯示大圖
- (void)viewBigImage {
    [self bigImageView];// 初始化大圖

    // 讓大圖從小圖的位置和大小開始出現
    CGRect originFram = _bigImageView.frame;
    _bigImageView.frame = self.smallImageView.frame;
    [self.view addSubview:_bigImageView];

    // 動畫到大圖該有的大小
    [UIView animateWithDuration:0.3 animations:^{
        // 改變大小
        _bigImageView.frame = originFram;
        // 改變位置
        _bigImageView.center = self.view.center;// 設置中心位置到新的位置
    }];

    // 添加陰影視圖
    [self bgView];
    [self.view addSubview:_bgView];

    // 將大圖放到最上層,否則會被后添加的陰影蓋住
    [self.view bringSubviewToFront:_bigImageView];
}

看代碼,我們首先調用了大圖的初始化方法,但是注意,此時還并沒有將大圖添加到界面上,如果這時候添加,就會直接顯示大圖了,在此之前,我們先保存了大圖自身的尺寸,然后將其尺寸位置設為和小圖完全一樣,然后才將它添加到界面上,從小圖的位置和尺寸,去動畫到大圖原本的尺寸,看起來就像是小圖放大成了大圖一樣對吧。這里的動畫我們使用的是最簡單的iOS 7開始支持的基于block的UIView動畫,在我的這篇博客中也有詳細講解:iOS基礎動畫教程

然后,我們初始化了陰影背景視圖,并添加到界面上,此時不要忘記,要再次將大圖手動推送到最上層,否則是會被后添加的陰影視圖覆蓋的。

到此,顯示大圖的動畫就結束了,挺簡單的吧,接下來我們看收起大圖的動畫,基本就是把上面的步驟倒過來了一次。

// 收起大圖
- (void)dismissBigImage {
    [self.bgView removeFromSuperview];// 移除陰影

    // 將大圖動畫回小圖的位置和大小
    [UIView animateWithDuration:0.3 animations:^{
        // 改變大小
        _bigImageView.frame = self.smallImageView.frame;
        // 改變位置
        _bigImageView.center = self.smallImageView.center;// 設置中心位置到新的位置
    }];

    // 延遲執行,移動回后再消滅掉
    double delayInSeconds = 0.3;
    __block ViewController* bself = self;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
        [bself.bigImageView removeFromSuperview];
        bself.bigImageView = nil;
        bself.bgView = nil;
    });
}

我們先移除陰影背景,然后將大圖動畫回小圖的尺寸和位置,看起來就像是縮小成了小圖一樣。然后我們使用了一個延遲函數,確保在圖片收縮回小圖以后,再將圖片移除界面,保證動畫的效果。

至此,就完成了我們整個的動畫了。這個例子中圖片是中規中矩地放在居中位置,你也可以試一下將小圖放在其他位置,其實真實的app中很少有居中放置的,從別的地方伸縮放大縮小效果會更加有趣的。當然了,如果小圖的位置不好獲取,那就直接設為從屏幕的中點開始縮放,效果也不錯。另外,你可能會疑惑為什么我要另行添加一個大圖的對象,而不直接對小圖的尺寸進行動畫呢?其實是完全可以的,只是在我的工程中有這個需求,所以我就直接拿過來講了哈哈哈。

這里是我的示例工程:https://github.com/Cloudox/ViewBigImageDemo


查看作者首頁

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

推薦閱讀更多精彩內容

  • 發現 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,155評論 4 61
  • 母親,明天您離開我們整整一年了,但在我心中您從未離開,母親,你已經住進我的心里了,每每想起你,我的心永遠是暖暖的....
    紫檀果閱讀 439評論 0 0
  • 愛我別走 詞:張震岳 曲:張震岳 我到了這個時候還是一樣 夜晚的寂寞容易叫人悲傷 我不敢想的太多 ...
    fam閱讀 268評論 0 0
  • 并不知道是從什么時候開始,我眼中的世界變得這樣有趣了。 太陽接了月亮的班不知疲累的升起,冬日終于盼來了春天來給他溫...
    陸茶茶閱讀 207評論 0 0
  • 一向喜歡把事情的結果想到最差,然后再問自己,如果結果是這個樣子,我還能不能接受,如果可以,好,別抱怨,心安理得的往...
    QLYH閱讀 237評論 0 0