Mac Dock como ampliación para iPad

Estoy intentando sacar el muelle como efecto de ampliación para mi aplicación iPad a través de la biblioteca iCarousel. Con eso puedo ampliar el elemento central del carrusel con la siguiente pieza de código, pero tratando de ampliar los elementos adyacentes del elemento central con un nivel de zoom poco menor que el elemento central.

- (CATransform3D)carousel:(iCarousel *)_carousel itemTransformForOffset: :(CGFloat)offset baseTransform:(CATransform3D)transform { CGFloat MAX_SCALE = 1.95f; //max scale of center item CGFloat MAX_SHIFT = 40.0f; //amount to shift items to keep spacing the same CGFloat shift = fminf(1.0f, fmaxf(-1.0f, offset)); CGFloat scale = 1.0f + (1.0f - fabs(shift)) * (MAX_SCALE - 1.0f); transform = CATransform3DTranslate(transform, offset * _carousel.itemWidth * 1.08f + shift * MAX_SHIFT, 0.0f, 0.0f); return CATransform3DScale(transform, scale, scale, scale); } 

Esperando por cualquier tipo de ayuda. Gracias.

Esta function podría ser su respuesta:

introduzca la descripción de la imagen aquí

su gráfico (para scaleMax = 3, xFactor = 1):

introduzca la descripción de la imagen aquí

Esta function se utiliza directamente para calcular el factor de escala desde el desplazamiento del carrusel. Además, debe desplazar los elementos hacia la izquierda y hacia la derecha para que no se superpongan (como ya hizo). Esto se puede hacer cambiando los elementos por la integral de la function, que funciona, pero la brecha en el centro es enorme de esta manera. O puede calcularse manualmente tomando una sum de todos los elementos escalados. El espacio puede mantenerse constante o se puede escalar por separado.

Observe que la escala es igual a 1 en el centro y desciende a 1 / scale_max por los bordes. Esto se debe a que la networkingucción no crea efectos pixelados indeseables. Haga la vista de elementos como desea que aparezca en el centro y las vistas en los bordes se networkingucirán.

Este podría ser el uso:

 -(CGFloat) scaleForX:(CGFloat)x xFactor:(CGFloat)xFactor centerScale:(CGFloat)centerScale { return (1+1/(sqrtf(x*x*x*x*xFactor*xFactor*xFactor*xFactor+1))*(centerScale-1.0))/centerScale; } - (CATransform3D)carousel:(iCarousel *)carousel itemTransformForOffset:(CGFloat)offset baseTransform:(CATransform3D)transform { //items in the center are scaled by this factor const CGFloat centerScale = 4.0f; //the larger the xFactor, the smaller the magnified area const CGFloat xFactor = 1.5f; //should the gap also be scaled? or keep it constant. const BOOL scaleGap = NO; const CGFloat spacing = [self carousel:carousel valueForOption:iCarouselOptionSpacing withDefault:1.025]; const CGFloat gap = scaleGap?0.0:spacing-1.0; //counting x offset to keep a constant gap CGFloat scaleOffset = 0.0; float x = fabs(offset); for(;x >= 0.0; x-=1.0) { scaleOffset+=[self scaleForX:x xFactor:xFactor centerScale:centerScale]; scaleOffset+= ((x>=1.0)?gap:x*gap); } scaleOffset -= [self scaleForX:offset xFactor:xFactor centerScale:centerScale]/2.0; scaleOffset += (x+0.5)*[self scaleForX:(x+(x>-0.5?0.0:1.0)) xFactor:xFactor centerScale:centerScale]; scaleOffset *= offset<0.0?-1.0:1.0; scaleOffset *= scaleGap?spacing:1.0; CGFloat scale = [self scaleForX:offset xFactor:xFactor centerScale:centerScale]; transform = CATransform3DTranslate(transform, scaleOffset*carousel.itemWidth, 0.0, 0.0); transform = CATransform3DScale(transform, scale, scale, 1.0); return transform; } 

con resultado: introduzca la descripción de la imagen aquí

Puede intentar alterar las constantes para diferentes comportamientos. También cambiar el exponente a otro número par puede ampliar aún más el pico y agudizar el descenso a la escala mínima.

Debe ver el episodio 219 de WWDC 2012 : Vistas de collections avanzadas y Creación de layouts personalizados . Sé que se refiere a las vistas de colección, pero estoy seguro de que encontrarás una forma de adaptar ese código 🙂