您可以通过 iCarousel
的委托方法中的 iCarouselTypeCustom
类型来实现此操作。
- (CATransform3D)carousel:(iCarousel *)carousel itemTransformForOffset:(CGFloat)offset baseTransform:(CATransform3D)transform
只需设置轮播图的类型(例如在轮播图视图控制器的 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;
const CGFloat zFactor = 150.0f;
const CGFloat normalFactor = 50.0f;
const CGFloat shrinkFactor = 3.0f;
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;
}
结果如下图所示:![result](https://istack.dev59.com/DoRPk.webp)
你可以根据自己的喜好调整浮点常量。
如果要在圆周上移动物品并缩放它们,只需使用三角函数进行平移,然后旋转和缩放:
- (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;
const CGFloat shrinkFactor = 2.0f;
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;
}
再次展示结果:
您可以在carousel:valueForOption:withDefault:
方法中调整间距和半径。
享受吧!:)
vertical
的属性,它设置了滚动手势的方向。此外,您需要在CATransform3DTranslate
中切换x
和y
参数,以便将项目沿y轴移动。 - burax