Sie können dies über die iCarousel
tun ‚s iCarouselTypeCustom
Typ in der Delegatmethode
- (CATransform3D)carousel:(iCarousel *)carousel itemTransformForOffset:(CGFloat)offset baseTransform:(CATransform3D)transform
einfach die Art des Karussells festgelegt (zB in viewDidLoad
des View-Controllers Karussell):
self.carousel.type = iCarouselTypeCustom;
Und berechnen Sie die Transformation, wie Sie möchten. Ich habe die Objekte auf eine Hyperbel gelegt und sie zusätzlich etwas verkleinert, während sie sich vom Zentrum entfernen. Das ist ganz dein Bild ähnelt, denke ich:
- (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;
}
und das Ergebnis:
Sie den Schwimmer Konstanten nach Ihren Wünschen anpassen können.
Für Gegenstände, um einen Kreis zu bewegen, während sie nur goniometrisches Funktionen für die Übersetzung verwenden Skalierung, dann drehen und skalieren:
- (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;
}
wieder das Ergebnis:
Sie den Abstand einstellen und der Radius in der Methode.
Viel Spaß! :)
Ich habe etwas anderes versucht als hier drin. und deine Lösung hat perfekt für mich gearbeitet. Ich habe mein gewünschtes Ergebnis. – Karthik
Hi, nehme an, ich möchte es zu einer vertikalen Hyperbel machen, wie würde ich das machen? Vielen Dank! –
Das iCarousel hat eine Eigenschaft 'vertical', die die Richtung der Scroll-Gesten einstellt. Außerdem müssen Sie die Parameter 'x' und' y' in 'CATransform3DTranslate' umschalten, um die Elemente entlang der y-Achse zu verschieben. – burax