Включил ли icarroussel 3D-колесо, как это?

Я должен представить меню, как это на картинке:

введите описание изображения здесь

где эти кнопки могут перемещаться вокруг серкла в центре, аналогично трехмерному эффекту, это означает, что вы можете видеть трансформацию размеров во время движения.

Я помню, что проект iCarroussel может делать такие вещи. Может ли кто-нибудь привести меня к правильному элементу управления, обеспечивающему эту анимацию?

Благодарю.

EDIT1:

Хорошо, я могу видеть, что iCarousel - почти то, что мне нужно, но как изменить вертикальный угол карусели, чтобы получить как на первом изображении? Посмотрите, как iCarousel по умолчанию.

введите описание изображения здесь

1 ответ

Решение

Что вам нужно сделать, это следующее (шаг за шагом, как указано ниже)

Скачать iCarousel...

  1. Откройте образец проекта в разделе "Тесты /ARC iOS" (откройте iCarouselExample.xcodeproj).

  2. Установите значение по умолчанию "Цилиндр" вместо "Coverflow" (в функции viewDidLoad iCarouselExampleViewController.m)

    - (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. Теперь предоставьте перспективу в iCarousel, обновив параметр _perspective в классе uCarousel. Сделайте это в функции настройки iCarousel.m:

    - (void)setUp
    {
        _type = iCarouselTypeLinear;
        //NOTE! Tweak perspective parameters
        _perspective = -1.0f/750.0f; 
        ... etc ...
    }
    
  6. Наконец, дайте всему виду "наклон" вокруг оси X, повернув карусель на 15 градусов вокруг оси x. Способ сделать это - настроить матрицу преобразования (установить transform = CATransform3DRotate(transform, -15.0f*M_PI/180.0f, 1.0f, 0.0f, 0.0f) В коде в функции transformForItemView iCarousel.m обновить это как следующим образом:

    - (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);
            }
    
Другие вопросы по тегам