『ios』動(dòng)畫篇-卡片效果

QQ20180714-233355-HD.gif

現(xiàn)在的任務(wù)一直都是搞h5,導(dǎo)致ios寫的不順手了,畢竟ios才是老本行,搞了個(gè)卡片效果。

卡片效果,主要需要注意的地方是副卡的形變,這個(gè)拿CGAffineTransformMakeScale搞。

創(chuàng)建 scrollview
-(instancetype)initWithFrame:(CGRect)frame{
    if (self = [super initWithFrame:frame]) {
        _XHScrollView = [[UIScrollView alloc]initWithFrame:frame];
        _XHScrollView.backgroundColor = [UIColor clearColor];
        _XHScrollView.delegate = self;
        [self addSubview:_XHScrollView];
    }
    return self;
}
初始化數(shù)據(jù)源
-(void)initCard:(NSArray *)cardArr{ //數(shù)據(jù)源
    CGFloat space = 0;
    CGFloat width = 0;
    CGFloat viewWidth = 0;
    for (UIView *cardView in cardArr) {
        NSInteger index = [cardArr indexOfObject:cardView];
        if (index == 0) {
            viewWidth = cardView.bounds.size.width;
        }
        space = self.frame.size.width - viewWidth;
        width = space/4+viewWidth;
        cardView.frame = CGRectMake(space/2 + (cardView.frame.size.width + space/4)*index, 0, viewWidth, cardView.frame.size.height);
        //形變
        
        CGFloat y = index *width;
        CGFloat value = (0-y)/width;
        CGFloat scale = fabs(cos(fabs(value)*M_PI/4));
        
        cardView.transform = CGAffineTransformMakeScale(1.0, scale);
         [_XHScrollView addSubview:cardView];
    }
        _XHScrollView.contentSize = CGSizeMake((space/2 + width*cardArr.count)+space/4, _XHScrollView.frame.size.height);
    
}
滾動(dòng)方法  副卡形變
-(void)scrollViewDidScroll:(UIScrollView *)scrollView{//滑動(dòng)
    CGFloat offset = scrollView.contentOffset.x;
    if (offset < 0) {
        return;
    }
    CGFloat space = 0;
    CGFloat width = 0;
    CGFloat viewWidth = 0;
    for (UIView *cardView in _XHScrollView.subviews) {
        NSInteger index = [_XHScrollView.subviews indexOfObject:cardView];
        if (index == 0) {
            viewWidth = cardView.bounds.size.width;
        }
        space = self.frame.size.width - viewWidth;
        width = space/4+viewWidth;
        //形變
        
        CGFloat y = index *width;
        CGFloat value = (offset-y)/width;
        CGFloat scale = fabs(cos(fabs(value)*M_PI/4));
        
        cardView.transform = CGAffineTransformMakeScale(1.0, scale);

    }
    float a = offset/(viewWidth + space/4); //當(dāng)前選中的是哪個(gè)。
    NSLog(@"%lf",offset);
    NSLog(@"%lf",viewWidth+space/4);
    if (a - (int)a > 0.5) {
        _currentIndex = (int)a + 1;
    } else {
        _currentIndex = (int)a;
    }
}
優(yōu)化主卡居中
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
    [self sendCardCenter];
}

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
    
    [self sendCardCenter];
}
- (void)sendCardCenter {
    float space = 0;
    float viewWidth = 0;
    for (UIView *view in _XHScrollView.subviews) {
        NSInteger index = [_XHScrollView.subviews indexOfObject:view];
        
        if (index == 0) {
            viewWidth = view.frame.size.width;
        }
        space = self.frame.size.width - viewWidth;
    }
    
    [_XHScrollView scrollRectToVisible:CGRectMake(_currentIndex*(viewWidth + space/4), 0, _XHScrollView.frame.size.width, _XHScrollView.frame.size.height) animated:YES];//
    
  
}

看完上面可能會(huì)有寫疑惑.這里是算比例的地方。

        CGFloat y = index *width;
        CGFloat value = (offset-y)/width;
        CGFloat scale = fabs(cos(fabs(value)*M_PI/4)); 

這里是這樣的。width我們比作三角形中最長(zhǎng)的那條邊比作c,offset-y我們比作三角形小角度旁邊的那條邊b.那么我們要的比例就是b/c。

1537155088521.jpg

我們以index == 1來(lái)舉例,隨著offset越來(lái)越大,value越來(lái)越小,但是我們需要第二個(gè)卡片scale越來(lái)越大,所以我們用cos來(lái)做這個(gè)事情。

DEMO地址 https://github.com/Butteryflyyer/XHCardScoll

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1、通過(guò)CocoaPods安裝項(xiàng)目名稱項(xiàng)目信息 AFNetworking網(wǎng)絡(luò)請(qǐng)求組件 FMDB本地?cái)?shù)據(jù)庫(kù)組件 SD...
    陽(yáng)明AI閱讀 16,240評(píng)論 3 119
  • 象棋,亦作“象碁”,漢族棋類益智游戲,中國(guó)象棋在中國(guó)有著三千多年的歷史,充滿中國(guó)特色的腦力活動(dòng),在中國(guó)古代,象棋被...
    415bac0a2364閱讀 310評(píng)論 0 0
  • 媽媽說(shuō)想我啦 爸爸也說(shuō)想我啦 學(xué)長(zhǎng)夸獎(jiǎng)我拍的照片好看啦 感覺(jué)其實(shí)幸福就在身邊 只是我們不曾注意過(guò) 在未來(lái)的日子里 ...
    半分微涼閱讀 129評(píng)論 2 1
  • 好久沒(méi)發(fā)教程了,是因?yàn)槿ソo別人做封面了,最近有g(shù)et到幾個(gè)新技能,與大家分享一下。最普通的封面就是底圖+字素,說(shuō)到...
    楨楨小丸子閱讀 1,495評(píng)論 0 0
  • 就算再笑,再?gòu)娜?一顆心,也會(huì)隨時(shí)為你而亂了分寸 無(wú)論你在哪,又將去往哪里 總有一顆星星會(huì)看到你
    小詩(shī)鴿閱讀 241評(píng)論 0 0

友情鏈接更多精彩內(nèi)容