【问题标题】:replaceSublayer example替换子层示例
【发布时间】:2010-09-14 22:09:26
【问题描述】:

我有以下代码,但我似乎无法让它工作。

首先我创建一个带有层的视图。

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 层。此时我处于程序的不同部分,所以我不能只调用 gradient。我需要以某种方式将其从 view 中解脱出来。

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

显然 0 应该是 旧层,但我不知道如何访问它。

谢谢。

【问题讨论】:

    标签: iphone cocoa-touch uikit core-animation


    【解决方案1】:

    我认为你应该可以使用这个:

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

    我离开了我的 Xcode 开发环境,但目前无法对其进行测试。

    【讨论】:

      【解决方案2】:

      保留一个指向渐变层的指针。如果你有很多他们用一个数组来做。 如果您仍然不想这样做,您可以随时使用它来获取所有图层的数组..

      [self.layer sublayers];
      

      然后您可以循环并检查一些参数以查看它们是否相同。就像在创建 layer.name 时设置它一样。

      【讨论】:

        【解决方案3】:

        这里是函数:

        #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 !
        }
        

        【讨论】:

          猜你喜欢
          • 2012-08-02
          • 2017-02-13
          • 1970-01-01
          • 2018-09-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多