iOS 仿微部落格戶端紅包載入介面 XLDotLoading

來源:互聯網
上載者:User

標籤:ssi   ima   int   顯示效果   center   sdn   view   poi   容器   

一、顯示效果


二、原理簡介
1、思路

要實現這個效果需要Crowdsourced Security Testing道這兩個硬幣是怎樣運動的,然後通過放大、縮小的效果實現的這種有距離感的效果。思路如下:

一、這兩個硬幣是在一定範圍內做相對運動的,可以先使一個硬幣在一個固定範圍內做左右的往複運動,另一個硬幣和它做“相對運動”即可。

二、讓硬幣從左至右移動時先變小再回複正常;從右至左移動時先變大再回複正常;這樣就實現了這用有距離感的“相對運動”。

2、代碼

第一步 要實現一個硬幣在一定範圍內實現左右往複運動,需要先固定一個範圍,當運動到左邊緣時讓其向右運動,當運動到有邊緣時讓其向左運動。

這裡用到了MVC的思想,先建立一個模型XLDot,給這個模型添加一個Direction屬性,然後通過改變模型direction屬性從而改變運動方向。

typedef NS_ENUM(NSInteger,DotDitection){    DotDitectionLeft = -1,    DotDitectionRight = 1,};@interface XLDot : UIView//移動方向 就兩種 左、右@property (nonatomic,assign) DotDitection direction;//字型顏色@property (nonatomic,strong) UIColor *textColor;@end

先初始化一個豆,放在容器的左邊,方向設為向右

    //初始化存放豆豆的的容器    _dotContainer = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 200)];    _dotContainer.center = self.center;    [self addSubview:_dotContainer];        XLDot *dot = [[XLDot alloc] initWithFrame:CGRectMake(0, 0, [self dotWidth],[self dotWidth])];    dot.backgroundColor = [UIColor redColor];    dot.direction = DotDitectionRight;    [_dotContainer addSubview:dot];
通過CADisplayLink實現重新整理工作,代碼如下

    _link = [CADisplayLink displayLinkWithTarget:self selector:@selector(reloadView)];    [_link addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];
重新整理代碼如下,通過移動到左右邊緣,改變direction屬性

//重新整理UI-(void)reloadView{    XLDot *dot1 = _dots.firstObject;    //改變移動方向、約束移動範圍    //移動到右邊距時    if (dot1.center.x >= _dotContainer.bounds.size.width - [self dotWidth]/2.0f) {        CGPoint center = dot1.center;        center.x = _dotContainer.bounds.size.width - [self dotWidth]/2.0f;        dot1.center = center;        dot1.direction = DotDitectionLeft;        [_dotContainer bringSubviewToFront:dot1];    }    //移動到左邊距時    if (dot1.center.x <= [self dotWidth]/2.0f) {        dot1.center = CGPointMake([self dotWidth]/2.0f, dot1.center.y);        dot1.direction = DotDitectionRight;        [_dotContainer sendSubviewToBack:dot1];    }    //更新第一個豆的位置    CGPoint center1 = dot1.center;    center1.x += dot1.direction * [self speed];    dot1.center = center1;}
顯示效果:



第二步 實現向左移動先放大再回複正常、向右運動先變小再回複正常。

代碼如下:

//顯示放大、縮小動畫-(void)showAnimationsOfDot:(XLDot*)dot{    CGFloat apart = dot.center.x - _dotContainer.bounds.size.width/2.0f;    //最大距離    CGFloat maxAppart = (_dotContainer.bounds.size.width - [self dotWidth])/2.0f;    //移動距離和最大距離的比例    CGFloat appartScale = apart/maxAppart;    //擷取比例對應餘弦曲線的Y值    CGFloat transfomscale = cos(appartScale * M_PI/2.0);    //向右移動則 中間變大 兩邊變小    if (dot.direction == DotDitectionLeft) {        dot.transform = CGAffineTransformMakeScale(1 + transfomscale/4.0f, 1 + transfomscale/4.0f);        //向左移動則 中間變小 兩邊變大    }else if (dot.direction == DotDitectionRight){        dot.transform = CGAffineTransformMakeScale(1 - transfomscale/4.0f,1 - transfomscale/4.0f);    }}

原理是利用餘弦函數曲線-π/2到π/2先變大再變小的特性


效果如下:



第三步 放置另一個豆豆,和第一個豆豆做“相對運動”,包括放大變小、運動方向;

保證相對距離的代碼:

    CGFloat apart = dot1.center.x - _dotContainer.bounds.size.width/2.0f;    CGPoint center2 = dot2.center;    center2.x = _dotContainer.bounds.size.width/2.0f - apart;    dot2.center = center2;
效果如下:



稍加潤色後:




三、代碼

GitHub地址


iOS 仿微部落格戶端紅包載入介面 XLDotLoading

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.