icarroussel能像这样启用3D滚轮吗?

时间:2013-04-20 20:28:14

标签: icarousel

我必须在图片中显示如下菜单:

enter image description here

这个按钮可以在中心的cercle周围移动,类似于3D效果,这意味着你可以在移动时看到尺寸变换。

我记得iCarroussel项目可以做这样的事情,任何pne引导我到提供这个动画的正确控制吗?

感谢。

EDIT1:

好的,我能够看到iCarousel几乎是我需要的,但是如何改变旋转木马的垂直角度才能像第一张照片一样?看看iCarousel是如何默认的。

enter image description here

1 个答案:

答案 0 :(得分:1)

您需要做的是以下(步骤如下所示)

下载iCarousel ......

  1. 在Tests / ARC iOS下打开示例项目(打开iCarouselExample.xcodeproj)

  2. 将默认设置为“Cylinder”而不是“Coverflow”(在iCarouselExampleViewController.m的viewDidLoad函数中)

    - (void)viewDidLoad 
    {
        [super viewDidLoad];
    
        carousel.type = iCarouselTypeCylinder;
        navItem.title = @"Cylinder";
    }
    
  3. 由于您的自定义轮播中只需要六个项目,因此在iCarouselExampleViewContoller.h中设置了“窗格数”...

    //NOTE! 
    #define NUMBER_OF_ITEMS 6
    
  4. 使用此NUMBER_OF_ITEMS设置轮播(即在iCarouselExampleViewContoller.m中更改设置功能,如下所示(使用'wrap',如图所示)

       - (void)setUp
    {
        //set up data
        wrap = YES;
        self.items = [NSMutableArray array];
    
        //NOTE! use preset number of vars in Carousel
        //for (int i = 0; i < 10000; i++)
        for (int i=0; i< NUMBER_OF_ITEMS; i++)
        {
           [items addObject:[NSNumber numberWithInt:i]];
        }
    }
    
  5. 现在通过更新uCarousel类中的_perspective参数,在iCarousel中提供透视图。在iCarousel.m的设置功能中执行此操作:

    - (void)setUp
    {
        _type = iCarouselTypeLinear;
        //NOTE! Tweak perspective parameters
        _perspective = -1.0f/750.0f; 
        ... etc ...
    }
    
  6. 最后,通过围绕x轴旋转15度旋转,使整个视图围绕X轴“倾斜”。这样做的方法是调整变换矩阵(set transform = CATransform3DRotate(transform,-15.0f * M_PI / 180.0f,1.0f,0.0f,0.0f)在代码中,在iCarousel.m的transformForItemView函数中更新为如下:

    - (CATransform3D)transformForItemView:(UIView *)view withOffset:(CGFloat)offset
    {   
    //set up base transform
        CATransform3D transform = CATransform3DIdentity;
        transform.m34 = _perspective;
        transform = CATransform3DTranslate(transform, -_viewpointOffset.width, _viewpointOffset.height, 0.0f);
    
        //perform transform
        switch (_type)
        {
        .... SKIPPED THE INITIAL SECTIONS OF THIS CODE WE MAKE OUR CHANGE IN THE CYLINDER SECTION ... 
            case iCarouselTypeCylinder:
            case iCarouselTypeInvertedCylinder:
            {
    
            CGFloat count = [self circularCarouselItemCount];
            CGFloat spacing = [self valueForOption:iCarouselOptionSpacing withDefault:1.0f];
            CGFloat arc = [self valueForOption:iCarouselOptionArc withDefault:M_PI * 2.0f];
            CGFloat radius = [self valueForOption:iCarouselOptionRadius withDefault:fmaxf(0.01f, _itemWidth * spacing / 2.0f / tanf(arc/2.0f/count))];
            CGFloat angle = [self valueForOption:iCarouselOptionAngle withDefault:offset / count * arc];
    
            if (_type == iCarouselTypeInvertedCylinder)
            {
                radius = -radius;
                angle = -angle;
            }
    
            if (_vertical)
            {
                transform = CATransform3DTranslate(transform, 0.0f, 0.0f, -radius);
                transform = CATransform3DRotate(transform, angle, -1.0f, 0.0f, 0.0f);
                return CATransform3DTranslate(transform, 0.0f, 0.0f, radius + 0.01f);
            }
            else
            {
    
                transform = CATransform3DTranslate(transform, 0.0f, 0.0f, -radius);
    
                //NOTE! Give it a tilt about the "X" axis
                transform = CATransform3DRotate(transform, -15.0f*M_PI/180.0f, 1.0f, 0.0f, 0.0f);
    
                transform = CATransform3DRotate(transform, angle, 0.0f, 1.0f, 0.0f);
    
                return CATransform3DTranslate(transform, 0.0f, 0.0f, radius + 0.01f);
            }