iOS:图层(在CADisplayLink上更新)添加到视图触发器[view layoutSubviews] 60x / sec - 为什么?

时间:2011-07-25 07:06:19

标签: ios uiview calayer layoutsubviews

我无法弄清楚这一点。

我有一个观点。

它是一个速度计。

我在车速表上插了一根针:

- (id) initWithFrame: (CGRect) frame
{    
    self = [super initWithFrame: frame]; // [super initWithCoder: coder];
    if (! self)
        return nil;

    :
    :
    : 
    self.needle = [ [ [Needle alloc] initWithMaxRadius: 0.5*300

    [self.layer addSublayer: needle.layer];

    self.needle.layer.position = CGPointMake( frame.size.width / 2, frame.size.height / 2 );

    return self;
}

针对象包含CALayer属性。

指针负责为每一帧定位自己 - 它设置了自己的显示链接处理程序并在该层上执行转换

现在突然我的视图的layoutSubviews方法每帧都被击中。

我无法理解这种行为。

我可以理解SUPERview中的一些变化导致此方法被击中。  但SUBlayer怎么能强迫这个?

肯定子层应该受其父级的支配吗?

我尝试过设置

self.autoresizesSubviews = NO;

显然没有效果

我正在寻找的财产将是

self.getsAutoresizedBySubviewsOrLayers = NO;

发生了什么事?

1 个答案:

答案 0 :(得分:1)

添加子视图将导致在子视图,目标和目标的所有子视图上调用layoutSubviews

您可以在问题When is layoutSubviews called?

中找到更多信息

顺便说一下,上面的代码中可能有一些内存泄漏。

如果needle是保留属性,则此行将导致过度保留:

self.needle = [ [ [Needle alloc] initWithMaxRadius: 0.5*300

一般来说,最好不要在init方法中引用“self.”。