代码之家  ›  专栏  ›  技术社区  ›  Rudiger

删除索引0处的CALayer

  •  14
  • Rudiger  · 技术社区  · 15 年前

    我添加了一个渐变层:

    [theView.layer insertSublayer:gradient atIndex:0];
    

    稍后在另一个方法中,我想删除这个层。我想我应该得到子层的数组,然后得到索引0处的子层,并在其上调用removeFromSuperlayer。这是正确的方法吗?如果不是,你能做到吗?

    干杯。

    4 回复  |  直到 15 年前
        1
  •  17
  •   Titouan de Bailleul    12 年前

    你可以用你描述的方式来做,但它不是那么可靠。问题是,如果在添加和删除之间对子层执行任何操作,子层的索引可能会更改,最终会删除不想删除的内容。

    最好的做法是保留对该层的引用,以后要删除它时只需调用 [theLayer removeFromSuperlayer]

    希望有帮助

        2
  •  9
  •   tc.    15 年前

    有趣的。。。

    有两个层属性可以使用(在这两种情况下,都必须在层上迭代):

    • CALayer.name “被一些布局管理器用来标识层”。将其设置为合理保证是唯一的(例如“MyClassName.gradient”)。
    • CALayer.style 是一本字典。可以使用CoreAnimation不使用的关键帧(例如。 NSMutableDictionary * d = [NSMutableDictionary dictionaryWithDictionary:layer.style]; [d setValue:[NSNumber numberWithBool:YES] forKey:@"MyClassName.gradient"]; layer.style = d; ). 这可能有助于将任意数据与视图关联(例如包含文本字段的单元格的索引路径…)。

    (我假设 [NSDictionary dictionaryWithDictionary:nil] 返回空字典,而不是返回nil或引发异常。相应的事情对 [NSArray arrayWithArray:nil] .)

    然而,额外的代码复杂度、性能损失和出错的概率可能超过内存使用量的小幅减少。如果有少量视图,每个视图4字节并不算多(即使有负载,4字节也是一个像素使用的内存!).

        3
  •  4
  •   edhnb    10 年前

    旧邮政。。但这可能对某人有帮助。。。

    我移除/替换CALayer的实现。使用Calayer.name作为tc。以上描述。

    CAGradientLayer *btnGradient = [CAGradientLayer layer];
    btnGradient.frame = button.bounds;
    btnGradient.name = @"gradient";
    btnGradient.colors = nil;
    btnGradient.colors = [NSArray arrayWithObjects:
                          (id)[[VOHelper getButtonColor:kSchemeBorder] CGColor],
                          (id)[[VOHelper getButtonColor:kSchemeButton] CGColor],
                          nil];
    
    if ([[[[button.layer sublayers] objectAtIndex:0] name] isEqualToString:@"gradient"]){
           [button.layer replaceSublayer:[[button.layer sublayers] objectAtIndex:0] with:btnGradient];
    }
    else{
        [button.layer insertSublayer:btnGradient atIndex:0];
    }
    
        4
  •  4
  •   App Dev Guy    6 年前

    斯威夫特对此有一些非常简单的解决方案:

    // SWIFT 4 update
    func removeSublayer(_ view: UIView, layerIndex index: Int) {
        guard let sublayers = view.layer.sublayers else {
            print("The view does not have any sublayers.")
            return
        }
        if sublayers.count > index {
            view.layer.sublayers!.remove(at: index)
        } else {
            print("There are not enough sublayers to remove that index.")
        }
    }
    // Call like so
    removeSublayer(view, layerIndex: 0)
    

    请记住,子层被视为一个数组,所以如果计数为2,那么索引中的2==1,因此 removeAtIndex(1) .

    有一堆选项可用于编辑子层。以后就别再打字了 sublayers!. 看看他们。

        5
  •  0
  •   jawad    6 年前

    斯威夫特4

      self.view.layer.sublayers = self.view.layer.sublayers?.filter { theLayer in
            !theLayer.isKind(of: CAGradientLayer.classForCoder())
      }
    
    推荐文章