【问题标题】:How to check if a button has this image如何检查按钮是否有此图像
【发布时间】:2017-12-09 12:55:51
【问题描述】:


我想检查 myButton 是否有命名图像。

我尝试了这个,但它不起作用

if (myButton.currentImage?.isEqual(UIImage(named: "ButtonAppuyer.png")) != nil){
        print("YES")
    } else {
        print("NO")
    }

这也行不通

if myButton.currentImage?.isEqual(UIImage(named: "ButtonAppuyer.png")){
        print("YES")
    } else {
        print("NO")
    }

【问题讨论】:

  • 我认为无法检查存储的图像

标签: ios swift image swift3 uibutton


【解决方案1】:
if myCell.followButton.currentImage.isEqual(UIImage(named: "yourImageName")) {
    //do something here
}

【讨论】:

  • 通常,Stack Overflow 更喜欢解释而不是“仅代码”的答案。考虑添加有关此代码如何回答问题的详细信息。
【解决方案2】:

在 swift 4.2 和 Xcode 10.1 中

buttonOne.image(for: .normal)!.pngData() == UIImage(named: "selected")!.pngData()

【讨论】:

    【解决方案3】:
     if let ButtonImage = myButton.image(for: .normal),
        let Image = UIImage(named: "ButtonAppuyer.png"),
        UIImagePNGRepresentation(ButtonImage) == UIImagePNGRepresentation(Image)
    {
        print("YES")
    } else {
        print("NO")
    }
    

    【讨论】:

      【解决方案4】:

      这是我在 Swift 3.0 中提出的。

      if let myButtonImage = myButton.image(for: .normal),
          let buttonAppuyerImage = UIImage(named: "ButtonAppuyer.png"),
          UIImagePNGRepresentation(myButtonImage) == UIImagePNGRepresentation(buttonAppuyerImage)
      {
          print("YES")
      } else {
          print("NO")
      }
      

      这可以清理很多。

      extension UIButton {
          func hasImage(named imageName: String, for state: UIControlState) -> Bool {
              guard let buttonImage = image(for: state), let namedImage = UIImage(named: imageName) else {
                  return false
              }
      
              return UIImagePNGRepresentation(buttonImage) == UIImagePNGRepresentation(namedImage)
          }
      }
      

      那就用吧

      if myButton.hasImage(named: "ButtonAppuyer.png", for: .normal) {
          print("YES")
      } else {
          print("NO")
      }
      

      【讨论】:

      • 与其比较DataData,我更愿意以某种方式将添加到按钮的图像名称映射到按钮,然后比较StringString。它会占用更少的内存。
      • @AdilSoomro,你不能。您可以做的最好的事情是“标记”每个图像,然后填充每个按钮的标记属性。但即便如此,如果不比较数据,您如何确定图像相同?
      • @AdilSoomro 有一些方法可以优化这种方法的性能。如果这种方法导致性能问题,我只会沿着这条路线开始。我更喜欢首先优化可维护性(直接和可读的代码)。
      • @JefferyThomas 有没有办法检查按钮是否设置了任何图像?
      • @QadirHussain button.image(for: .normal) != nil
      【解决方案5】:

      您可以将按钮图像和命名图像转换为NSDatas 并比较两个数据对象:

      let imgData1 = UIImagePNGRepresentation(buttonImage)
      let imgData2 = UIImagePNGRepresentation(namedImage)
      let equal = imgData1 == imgData2
      

      请注意,这仅适用于两个图像完全相同的情况(例如来自同一个源文件);如果一个是另一个的缩小版本,它就不起作用。

      另外,应该提到的是,这可能是一项非常昂贵的操作,不应该经常运行。

      【讨论】:

        【解决方案6】:

        无法从 UI 元素中检索图像名称。您需要将要检索的值存储在另一个位置。

        例如,您可以创建 UIButton 的自定义子类,其中包含用于存储图像名称或其他识别数据的附加属性。

        【讨论】:

          猜你喜欢
          • 2021-11-30
          • 1970-01-01
          • 1970-01-01
          • 2020-01-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多