用iCarousel缩放项目

我试图使用iCarousel作为我的解决scheme,我需要实现类似下面的图像 在这里输入图像说明

这应该是完全的方式

iCarouselOptionFadeMin iCarouselOptionFadeMax iCarouselOptionFadeRange iCarouselOptionFadeMinAlpha工作使用

 - (CGFloat)carousel:(iCarousel *)carousel valueForOption:(iCarouselOption)option withDefault:(CGFloat)value 

我试图创build一个完全一样的function

 - (CGFloat)alphaForItemWithOffset:(CGFloat)offset 

我发现它使用offset值来完成,但是事情并没有起作用,任何人都可以帮助我实现这个目标。

谢谢。

您可以通过委托方法中的iCarouseliCarouselTypeCustomtypes来完成此操作

 - (CATransform3D)carousel:(iCarousel *)carousel itemTransformForOffset:(CGFloat)offset baseTransform:(CATransform3D)transform 

只需设置传送带的types(例如在传送带视图控制器的viewDidLoad中):

 self.carousel.type = iCarouselTypeCustom; 

并根据你的喜好来计算转换。 我把这些东西放在双曲线上,当它们离开中心的时候,它们会缩小。 这很像你的形象,我想:

 - (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; } 

结果是: 结果

你可以根据自己的喜好调整浮点常量。

要在缩放圆周时移动物体,只需使用测angular函数进行平移,然后旋转和缩放:

 - (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; } 

结果是: RESULT2

您可以调整carousel:valueForOption:withDefault:的间距和半径carousel:valueForOption:withDefault: method。

请享用! 🙂

有点修改,并在SWIFT复制粘贴;) – 完美的作品给我

 func carousel(carousel: iCarousel, valueForOption option: iCarouselOption, withDefault value: CGFloat) -> CGFloat { if option == iCarouselOption.Spacing { return value * 1.8 } return value } func carousel(carousel: iCarousel, itemTransformForOffset offset: CGFloat, baseTransform transform: CATransform3D) -> CATransform3D { let offsetFactor = self.carousel(carousel, valueForOption: iCarouselOption.Spacing, withDefault: 1) * carousel.itemWidth let zFactor: CGFloat = 150 let normalFactor: CGFloat = 0 let shrinkFactor: CGFloat = 1 let f = sqrt(offset*offset+1)-1 var transform = CATransform3DTranslate(transform, offset*offsetFactor, f*normalFactor, f*(-zFactor)); transform = CATransform3DScale(transform, 1/(f/shrinkFactor+1), 1/(f/shrinkFactor+1), 1); return transform; } 

我没有足够的声望评论,所以我不得不要求进一步的问题作为答复:(

@burax是否可以在线性排列项目而不是双曲线,但保持resize?

问候,并抱歉这样问

编辑:随机尝试我实现了这个:

 - (CATransform3D)carousel:(iCarousel *)carousel itemTransformForOffset:(CGFloat)offset baseTransform:(CATransform3D)transform { const CGFloat radius = [self carousel:carousel valueForOption:iCarouselOptionRadius withDefault:5050.0]; const CGFloat offsetFactor = [self carousel:carousel valueForOption:iCarouselOptionSpacing withDefault:0.8f]*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; } 

有可能是一个更好的办法,但我是转型新:)