使用iCarousel缩放项目

iph*_*nic 10 iphone objective-c scaletransform ios icarousel

我试图使用iCarousel作为我的解决方案,我需要实现类似下图的内容 在此输入图像描述

应该是这样的

iCarouselOptionFadeMin iCarouselOptionFadeMax iCarouselOptionFadeRange iCarouselOptionFadeMinAlpha 使用

- (CGFloat)carousel:(iCarousel *)carousel valueForOption:(iCarouselOption)option withDefault:(CGFloat)value
Run Code Online (Sandbox Code Playgroud)

我试着创建一个完全相同的函数

- (CGFloat)alphaForItemWithOffset:(CGFloat)offset
Run Code Online (Sandbox Code Playgroud)

我发现它可以使用offset价值观来完成,但事情并没有对我有用,任何人都可以帮我实现这个目标吗?

谢谢.

bur*_*rax 27

您可以通过委托方法中iCarouseliCarouselTypeCustom类型来执行此操作

- (CATransform3D)carousel:(iCarousel *)carousel itemTransformForOffset:(CGFloat)offset baseTransform:(CATransform3D)transform
Run Code Online (Sandbox Code Playgroud)

只需设置轮播的类型(例如在viewDidLoad轮播的视图控制器中):

self.carousel.type = iCarouselTypeCustom;
Run Code Online (Sandbox Code Playgroud)

并根据需要计算变换.我把物体放在双曲线上,当它们远离中心时,它们会稍微缩小.我认为这非常类似于你的形象:

- (CATransform3D)carousel:(iCarousel *)carousel itemTransformForOffset:(CGFloat)offset baseTransform:(CATransform3D)transform
{
    const CGFloat offsetFactor = [self carousel:carousel valueForOption:iCarouselOptionSpacing withDefault:1.0f]*carousel.itemWidth;

    //The larger these values, as the items move away from the center ...

    //... the faster they move to the back
    const CGFloat zFactor = 150.0f;

    //... the faster they move to the bottom of the screen
    const CGFloat normalFactor = 50.0f;

    //... the faster they shrink
    const CGFloat shrinkFactor = 3.0f;

    //hyperbola
    CGFloat f = sqrtf(offset*offset+1)-1;

    transform = CATransform3DTranslate(transform, offset*offsetFactor, f*normalFactor, f*(-zFactor));
    transform = CATransform3DScale(transform, 1/(f/shrinkFactor+1.0f), 1/(f/shrinkFactor+1.0f), 1.0);
    return transform;
}
Run Code Online (Sandbox Code Playgroud)

结果: 结果

你可以根据自己的喜好调整浮点常数.

要在缩放它们的同时围绕圆圈移动项目,只需使用测角功能进行平移,然后旋转和缩放:

- (CGFloat)carousel:(iCarousel *)carousel valueForOption:(iCarouselOption)option withDefault:(CGFloat)value
{
    if (option == iCarouselOptionSpacing)
    {
        return value * 2.0f;
    }
    if(option == iCarouselOptionVisibleItems)
    {
        return 11;
    }
    if(option == iCarouselOptionWrap) return YES;
    return value;
}

- (CATransform3D)carousel:(iCarousel *)carousel itemTransformForOffset:(CGFloat)offset baseTransform:(CATransform3D)transform
{
    const CGFloat radius = [self carousel:carousel valueForOption:iCarouselOptionRadius withDefault:200.0];
    const CGFloat offsetFactor = [self carousel:carousel valueForOption:iCarouselOptionSpacing withDefault:1.0f]*carousel.itemWidth;
    const CGFloat angle = offset*offsetFactor/radius;

    //... the faster they shrink
    const CGFloat shrinkFactor = 2.0f;
    //hyperbola (now only for shrinking purposes)
    CGFloat f = sqrtf(offset*offset+1)-1;


    transform = CATransform3DTranslate(transform, radius*sinf(angle), radius*(1-cosf(angle)), 0.0);
    transform = CATransform3DRotate(transform, angle, 0, 0, 1);
    transform = CATransform3DScale(transform, 1/(f*shrinkFactor+1.0f), 1/(f*shrinkFactor+1.0f), 1.0);
    return transform;
} 
Run Code Online (Sandbox Code Playgroud)

结果又是: RESULT2

您可以在carousel:valueForOption:withDefault:方法中调整间距和半径.

请享用!:)