Как изменить направление вращения колеса со 180 на 0 по оси X в iOS?

У меня есть код (ниже), который работает правильно и анимирует колесо, поворачивая его от X0 до X180 (поэтому движение происходит по оси Z, см. иллюстрацию). Я хочу изменить направление вращения с X180 на X0.

направление вращения текущего рабочего кода

Когда я нажимаю кнопку, вызывается следующий метод - (void)expand, в котором происходит анимация:

- (void)expand {

   [CATransaction begin];

    CGFloat step =  DegreesToRadians(kApertureAngle);

     for (NSInteger i=[_items count]-1; i>=0; i--) {

        CALayer* layer = nil;

        CGFloat angle = -step * (CGFloat)i - (step * 0.65);

        CATransform3D transform = CATransform3DConcat(CATransform3DMakeScale(1.0f, 1.0f, 1.0f),
                                                      CATransform3DMakeRotation(angle, 0.0f, 0.0f, 1.0f));

        CABasicAnimation* leafAnimation = [CABasicAnimation animationWithKeyPath:@"transform"];

        [leafAnimation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
        [leafAnimation setToValue:[NSValue valueWithCATransform3D:transform]];
        [leafAnimation setFillMode:kCAFillModeForwards];
        [leafAnimation setRemovedOnCompletion: NO];
        [leafAnimation setDuration:0.4f];

        layer = [_leavesLayers objectAtIndex:i];
        [layer addAnimation:leafAnimation forKey:@"expand"];


        CABasicAnimation* scaleImageAnimation = [CABasicAnimation animationWithKeyPath:@"transform"];
        [scaleImageAnimation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]];

        [scaleImageAnimation setToValue:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.0f, 1.0f, 1.0f)]];
        [scaleImageAnimation setFillMode:kCAFillModeForwards];
        [scaleImageAnimation setRemovedOnCompletion: NO];


        CGPoint point = CGPointMake(0.65*97.0f * cos(angle) + CGRectGetMidX(self.bounds), 0.65*97.0f * sin(angle) + CGRectGetMidY(self.bounds));

        CABasicAnimation* positionImageAnimation = [CABasicAnimation animationWithKeyPath:@"position"];
        [positionImageAnimation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]];
        [positionImageAnimation setToValue:[NSValue valueWithCGPoint:point]];
        [positionImageAnimation setFillMode:kCAFillModeForwards];
        [positionImageAnimation setRemovedOnCompletion: NO];

        CAAnimationGroup* group = [CAAnimationGroup animation];
        [group setAnimations:[NSArray arrayWithObjects:scaleImageAnimation, positionImageAnimation, nil]];
        [group setFillMode:kCAFillModeForwards];
        [group setRemovedOnCompletion: NO];
        [group setDuration:0.2f];
        [group setBeginTime:CACurrentMediaTime () + 0.27f];

        layer = [_imagesLayers objectAtIndex:i];
        [layer addAnimation:group forKey:@"show"];

    }

    [CATransaction commit];


}

Это код, который добавляет изображения в секцию вращающегося колеса:

- (void)addLeaves {

    [_leavesLayers makeObjectsPerformSelector:@selector(removeFromSuperlayer)];
    [_leavesLayers removeAllObjects];

    // iterate all images
    [_items enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {

        UIImage *image = [UIImage imageNamed:kLeafImageName];

        CALayer* layer = [CALayer layer];

        layer.contents = (id)image.CGImage;
        layer.frame = CGRectMake(0.0f, 0.0f, image.size.width, image.size.height);
        layer.anchorPoint = CGPointMake(0.0f, 0.5f);
        layer.position = CGPointMake(CGRectGetMidX(self.bounds), CGRectGetMidY(self.bounds));
        layer.transform = CATransform3DMakeScale(0.15f, 0.15f, 1.0f);

        // add layer
        [self.layer addSublayer:layer];
        [_leavesLayers addObject:layer];

    }];


}

- (void)addImages {
    // remove from superlayer
    [_imagesLayers makeObjectsPerformSelector:@selector(removeFromSuperlayer)];

    // clean array
    [_imagesLayers removeAllObjects];


    // iterate all images
    [_items enumerateObjectsUsingBlock:^(AURosetteItem* obj, NSUInteger idx, BOOL *stop) {
        // set content image
        UIImage* image = [obj normalImage];

        CALayer* imageLayer = [CALayer layer];

        imageLayer.contents = (id)image.CGImage;
        imageLayer.frame = CGRectMake(0.0f, 0.0f, image.size.width, image.size.height);
        imageLayer.anchorPoint = CGPointMake(0.5f, 0.5f);
        imageLayer.position = CGPointMake(CGRectGetMidX(self.bounds), CGRectGetMidY(self.bounds));
        imageLayer.transform = CATransform3DMakeScale(0.01f, 0.01f, 1.0f);
        imageLayer.opacity = 1.0f;

        [self.layer addSublayer:imageLayer];
        [_imagesLayers addObject:imageLayer];        
    }];
}

person iOS Dev    schedule 08.10.2015    source источник


Ответы (1)


Попробуйте определить угол как

CGFloat angle = - M_PI + step * (CGFloat)i - (step * 0.65);

То есть оставьте постоянную часть угла, но измените переменную часть step*i на π - step*i.

person Cimbali    schedule 08.10.2015
comment
@Cimbli, это не работает. Я хочу изменить направление начальной точки вращающегося колеса. Весь код работает нормально, но это не влияет на начальную точку. Это всегда начинается с X0, но я хочу начать с X180. Большое спасибо за ваш повтор. - person iOS Dev; 20.10.2015
comment
@iOSDev Я не понимаю, что ты говоришь. - person Cimbali; 20.10.2015