Escala artículos con iCarousel

Estaba intentando utilizar iCarousel para mis soluciones, necesito lograr algo así como la image a continuación introduzca la descripción de la imagen aquí

Debe ser exactamente el path

iCarouselOptionFadeMin iCarouselOptionFadeMax iCarouselOptionFadeRange iCarouselOptionFadeMinAlpha funciona utilizando

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

Intenté crear una function exactamente igual

 - (CGFloat)alphaForItemWithOffset:(CGFloat)offset 

Descubrí que se puede hacer utilizando valores de offset , pero las cosas no me funcionan, ¿alguien puede ayudarme a lograr esto?

Gracias.

Puede hacerlo a través del tipo iCarouselTypeCustom del iCarouselTypeCustom en el método de delegado

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

Simplemente configure el tipo de carrusel (p. Ej., En viewDidLoad del controller de vista del carrusel):

 self.carousel.type = iCarouselTypeCustom; 

Y calcula la transformación como quieras. He colocado los objects en una hipérbola, y los contraigo un poco más a medida que se alejan del centro. Eso se asemeja bastante a tu image, creo:

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

y el resultado: resultado

puedes ajustar las constantes de flotación a tu gusto.

Para mover elementos alnetworkingedor de un círculo mientras los escala, simplemente use funciones goniométricas para la traducción, luego gire y escala:

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

y de nuevo, el resultado: resultado2

puede ajustar el espacio y el radio en el carousel:valueForOption:withDefault: método.

¡Disfrutar! 🙂

Un poco modificado y en SWIFT copyr pasta;) – funciona perfecto para mí

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

No tengo suficiente reputación para comentar, así que tengo que hacer una nueva pregunta como respuesta 🙁

@burax ¿es posible diseñar elementos en línea lineal en lugar de una hipérbola pero mantener el cambio de tamaño?

Saludos, y perdón por preguntar así

Editar: con bashs aleatorios logré con esto:

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

Probablemente hay una mejor manera, pero soy nuevo en las transformaciones 🙂