【问题标题】:Tagging CALayers in iPhone在 iPhone 中标记 CALayers
【发布时间】:2011-02-20 16:00:05
【问题描述】:

我正在寻找一种能够在层次结构中搜索唯一 CALayer 的通用方法,而无需记住该层在层次结构中的位置(并使用 sublayer: 和 superlayer: 方法)。

我知道 UIViews 可以做到这一点(这使得翻转视图变得容易)但是 CALayer 可以吗?

提前感谢您的帮助

佩曼

【问题讨论】:

    标签: search calayer


    【解决方案1】:

    道歉。我是个笨蛋。 CALayer 是一个符合键值编码的容器,因此我可以在任何情况下创建任意值(包括标签)。例如,要创建一个标签,我们这样做:

    [rootLayer setValue:[NSNumber numberWithInt:101] forKey:@"PFtag"];
    

    谢谢

    【讨论】:

      【解决方案2】:

      您还可以使用 CALayer 的 name 属性。

      [layer setName:@"myKey"];
      

      要查找,

      - (CALayer *)myLayer {
      
          for (CALayer *layer in [superLayerOfMyLayer sublayers]) {
      
                  if ([[layer name] isEqualToString:LabelLayerName]) {
                      return layer;
                  }
          }
      
          return nil;
      }
      

      【讨论】:

      • 嗯。除了把它们全部走一遍之外,没有办法通过名称获得一层吗?嗯,有总比没有好!
      • 可以使用属性来避免我想。不过最好有办法查一下。
      【解决方案3】:

      在 Swift 中你可以做到这一点

      let layer = CAShapeLayer()
      layer.name = "\(index)"
      

      然后要获取图层,您可以这样做

      for item in self.layer.sublayers! {
          if item.name == "\(index)" {
              item.removeFromSuperlayer()
              item.removeAllAnimations()
          }
      }
      

      【讨论】:

      • 现在在循环中使用 where 子句而不是 if 语句会更习惯用法:for item in self.layer.sublayers! where item.name == "\(index)"。也可能最好不要使用强制展开,但这更主观。
      【解决方案4】:

      现代保险箱对此的看法。

      为图层命名:

      layer.name = "MyLayer"
      

      然后,过滤所有搜索名称的子层:

      layer.sublayers?
          .filter { layer in return layer.name == "MyLayer" }
          .forEach { layer in
              layer.removeFromSuperlayer()
              layer.removeAllAnimations()
      }
      

      【讨论】:

      • 不错的解决方案!我认为您可以将layer in return layer.name == "MyLayer" 替换为$0.name == "MyLayer"
      • 谢谢@koen 这绝对是有效的,但有时我更喜欢使用 $0 来命名它的清晰性。但是,两者都可以正常工作并且归结为开发人员偏好/强制样式(如果适用)
      【解决方案5】:

      首先,您需要命名您的 CALayer

          let shadowLayer = CALayer()
          shadowLayer.name = "myname"
      

      之后,您只需按名称进行搜索:

          if let neuBlackLayer = layer.sublayers?.first(where: { $0.name == "myname" }) {
             // do something with your layer
          }
      

      与守卫相同:

          guard let neuBlackLayer = layer.sublayers?.first(where: { $0.name == "myname" }) else { return }
          // do something with your layer
      

      添加此答案以澄清其他人的答案:

      1. 一目了然,无需过滤或循环。
      2. 它完成了所问的问题:找到唯一层的方法(没有将其从超级层中移除等)
      3. 它是使用 Swift 5.1 编写的

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-15
        • 1970-01-01
        • 1970-01-01
        • 2019-12-12
        相关资源
        最近更新 更多