代码之家  ›  专栏  ›  技术社区  ›  John Smith

替换子层示例

  •  1
  • John Smith  · 技术社区  · 14 年前

    我有下面的代码,我似乎无法让它工作。

    UIView *view = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 100)] autorelease];
    CAGradientLayer *gradient = [CAGradientLayer layer];
    gradient.frame = view.bounds;
    gradient.colors = [NSArray arrayWithObjects:(id)[[UIColor blackColor] CGColor], (id)[[UIColor whiteColor] CGColor], nil];
    [view.layer insertSublayer:gradient atIndex:0];
    

    下一步我需要替换那个层。我尝试了以下方法,但失败了,因为我不知道如何访问第0层。在这一点上,我在程序的不同部分,所以我不能只是打电话 . 我需要把它从 看法 不知怎么的。

    [view.layer replaceSublayer:0 with:newgradient];
    

    显然0应该是 但我不知道怎么取。

    谢谢。

    3 回复  |  直到 14 年前
        1
  •  7
  •   Greg    14 年前

    我想你应该可以用这个:

    [view.layer replaceSublayer:[[view.layer sublayers] objectAtIndex:0]
                with:newGradient];
    

    我离开了我的Xcode开发环境,现在还不能测试这个。

        2
  •  1
  •   Justin Meiners    14 年前

    如果你仍然不想这样做,你可以用这个来得到所有层的数组。。

    [self.layer sublayers];
    

    然后您可以循环检查一些参数,看看它们是否相同。就像设定图层名称当你创造它的时候。

        3
  •  1
  •   Nick Utenkov    13 年前

    #define MyGradientLayerName @"MyGradient"
    
    void makeViewGradient(UIView *pView,BOOL bRemoveBackground,CGColorRef clr1,CGColorRef clr2)
    {
        CAGradientLayer *gradient = [CAGradientLayer layer];
        gradient.name = MyGradientLayerName;
    
        gradient.frame = pView.bounds;
        gradient.colors = [NSArray arrayWithObjects:(id)clr1,(id)clr2,nil];
    
        CALayer *pGradientLayer = nil;
        NSArray *ar = pView.layer.sublayers;
        for (CALayer *pLayer in ar)
        {
            if ([pLayer.name isEqualToString:MyGradientLayerName])
            {
                pGradientLayer = pLayer;
                break;
            }
        }
        if (!pGradientLayer) [pView.layer insertSublayer:gradient atIndex:0];
        else [pView.layer replaceSublayer:pGradientLayer with:gradient];
    
        if (bRemoveBackground) pView.backgroundColor = nil;//free memory !
    }