转换属性不适用于CALayer

时间:2015-11-13 10:52:14

标签: ios calayer catransform3d

我尝试将60个Dot对象的副本添加到图层,每个对象必须具有其transform属性(以形成圆圈)。但由于某些原因,转换属性不适用于图层。并且所有点实例都放在同一个地方(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];
    }
}

1 个答案:

答案 0 :(得分:0)

您正在将旋转变换应用于圆形图层,其中锚点(旋转发生的位置)位于该图层的中心。您不会看到该转换带来任何影响。

认为(你脑子里很难做到这些,而且我已经做了一段时间了,你需要这样做)将图层的锚点更改为CGPointMake(0.5,y),其中y是从点的中心到时钟中心的距离,以点的大小为单位。然后旋转将围绕该点进行,这应该将您的点放在正确的位置。