Свойство преобразования не применяется к CALayer

Я пытаюсь добавить 60 копий моего объекта Dot в слой, каждый из этих объектов должен иметь свое свойство преобразования (чтобы сформировать круг). Но по какой-то причине свойство преобразования не применяется к слоям. И все точечные экземпляры размещены на одном и том же месте (на 12 часов). Это мой код:

- (void)addDots {
    CGFloat angle = (2*M_PI) / 60;

    for (int i = 0; i < 60; i++) {
        CALayer *layerDot = [self addDotWithSize:7 andColor:[UIColor blueColor]];
        layerDot.transform = CATransform3DMakeRotation(i*angle, 0.0, 0.0, 1.0);
        [self.layer addSublayer:layerDot];
    }
}


- (CALayer *)addDotWithSize:(float)size andColor:(UIColor *)color {
    CALayer *dotLayer = [[CALayer alloc] init];
    dotLayer.bounds = CGRectMake(0.0, 0.0, size, size);
    dotLayer.position = CGPointMake(rectMain.size.width/2, 20);
    dotLayer.backgroundColor = color.CGColor;
    dotLayer.cornerRadius = size/2;
    dotLayer.masksToBounds = YES;

    return dotLayer;
}

Что я делаю неправильно?

ОБНОВЛЕНИЕ: действительно какой-то глупый вопрос). Дело в том, что прямо перед этим я сделал то, что хочу сейчас, с CAReplicatorLayer и его свойством instanceTransform, установленным в CATransform3DMakeRotation(angle, 0.0, 0.0, 1.0), - сделал свое дело. Ради чего я попробовал то же самое с layer.transfom... Думаю, мне нужно отдохнуть.

ОБНОВЛЕНИЕ 2

Чтобы разместить точки в форме круга, вам нужно сделать следующее (надеюсь, это будет кому-то полезно):

- (void)addDots {
    CGFloat angle = (2*M_PI) / 60;
    CGFloat angle90Offset = ((90) / 180.0 * M_PI);

    float x0 = CGRectGetMidX(rectMain);
    float y0 = CGRectGetMidY(rectMain);

    float radius = rectMain.size.width/2 - 20;

    for (int i = 0; i < 60; i++) {
        CALayer *layerDot2 = [self addDotWithSize:size andColor:[UIColor darkGrayColor]];
        layerDot2.position = CGPointMake(x0 + cos(angle*i - angle90Offset) * radius, y0 + sin(angle*i - angle90Offset) * radius);
        [self.layer addSublayer:layerDot2];
    }
}

person daleijn    schedule 13.11.2015    source источник
comment
Вы импортировали структуру кварт/ядро ..   -  person Kishore Kumar    schedule 13.11.2015
comment
@KishoreKumar: если бы он не импортировал QuartzCore, он бы получил ошибку компилятора.   -  person Vatsal Manot    schedule 13.11.2015
comment
ну, все точки добавляются в одно и то же место, как довольно четко указано в вашем коде, а затем вы вращаете каждую точку вокруг ее центра. Почему это должно изменить местоположение? Вы просто упускаете правильное смещение или указываете правильную опорную точку для вращения, чтобы иметь какое-либо видимое влияние.   -  person luk2302    schedule 13.11.2015
comment
Вы устанавливаете положение в addDotWithSize, поэтому изменение преобразования не приведет к простому повороту слоя (чего вы не заметите, если это точка)?   -  person trojanfoe    schedule 13.11.2015


Ответы (1)


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

Я думаю (довольно сложно сделать это в уме, и я уже давно ничего подобного не делал), вам нужно изменить точку привязки слоя на CGPointMake(0.5,y), где y расстояние от центра вашей точки до центра часов, в единицах размера точки. Затем вращение будет происходить вокруг этой точки, что должно поставить ваши точки в правильное положение.

person jrturton    schedule 13.11.2015