【问题标题】:How to add system icons for a UIButton programmatically?如何以编程方式为 UIButton 添加系统图标?
【发布时间】:2016-06-12 08:55:42
【问题描述】:

为 UIButton 添加自定义图像或背景很容易,但似乎没有编程方式为 UIButton 设置以下默认 iOS 图标之一,我知道它可以应用于导航条形按钮,我不需要,我想把它应用到一个简单的UIButton,有什么提示吗?

【问题讨论】:

  • 你可以在网上找到这些图标!喜欢这里:icons8.com

标签: ios swift uibutton


【解决方案1】:

对于 Swift 5,语法是:

button.setImage(UIImage(systemName: "search"), for: .normal)

也可以通过添加SymbolConfiguration来设置图标的权重:

let boldConfig = UIImage.SymbolConfiguration(weight: .bold)
let boldSearch = UIImage(systemName: "search", withConfiguration: boldConfig)

button.setImage(boldSearch, for: .normal)

请参阅:Apple documentation 以获取可用名称(API 列)或转到 Interface Builder,选择 UIButton 并在 Attributes Inspector 中选择 Image,这将为您提供所有可用图标的列表。

【讨论】:

  • 你需要设置@available属性来检查iOS版本。
  • 不错的选项,因为我们有很多来自系统本身的选项。
  • 为什么这对我不起作用?我的按钮最终是空的。我有一个条件,只有在 iOS 版本为 13+ 时才会尝试执行上述代码
  • @BrianReinhold 尝试使用名称“放大镜”
【解决方案2】:
import UIKit

extension UIImage {

    public convenience init?(_ systemItem: UIBarButtonItem.SystemItem) {

        guard let sysImage = UIImage.imageFrom(systemItem: systemItem)?.cgImage else {
            return nil
        }

        self.init(cgImage: sysImage)
    }

    private class func imageFrom(systemItem: UIBarButtonItem.SystemItem) -> UIImage? {

        let sysBarButtonItem = UIBarButtonItem(barButtonSystemItem: systemItem, target: nil, action: nil)

        //MARK:- Adding barButton into tool bar and rendering it.
        let toolBar = UIToolbar()
        toolBar.setItems([sysBarButtonItem], animated: false)
        toolBar.snapshotView(afterScreenUpdates: true)

        if  let buttonView = sysBarButtonItem.value(forKey: "view") as? UIView{
            for subView in buttonView.subviews {
                if subView is UIButton {
                    let button = subView as! UIButton
                    let image = button.imageView!.image!
                    return image
                }
            }
        }
        return nil
    }
}

这是我们如何使用它的示例:

 let button = UIButton() ;
 let systemImage = UIImage(systemItem: .trash) ;
 button.setImage(systemImage, for: .normal)

【讨论】:

    【解决方案3】:

    我找到了 2521 个系统图标,作为数值。

    @available(iOS 13.0, *)
    @objc public extension UIImage{
    
        var assetName: String? {
            guard let imageAsset = imageAsset else { return nil }
            return imageAsset.value(forKey:"assetName") as? String
        }
    
        static var square_and_arrow_up: UIImage? {
            return UIImage(systemName: "square.and.arrow.up")
        }
        static var square_and_arrow_up_fill: UIImage? {
            return UIImage(systemName: "square.and.arrow.up.fill")
        }
        static var square_and_arrow_down: UIImage? {
            return UIImage(systemName: "square.and.arrow.down")
        }
        ...
    

    截图: github:link

    【讨论】:

      【解决方案4】:

      现在你可以这样做了

      button.setImage(UIImage(.search), for: .normal)
      

      【讨论】:

      • 我现在使用 Swift 4 和 IOS 9 或更高版本的编码
      【解决方案5】:
          var logoImage :[UIImage?] = []
              
           // make an array of UIImage 
      //load image in asset and append in array
              @IBOutlet weak var table1: UITableView!
              override func viewDidLoad() {
                  super.viewDidLoad()
                  logoImage.append(UIImage(named: "image0"))
                  logoImage.append(UIImage(named: "image1"))
                  logoImage.append(UIImage(named: "image2"))
                  logoImage.append(UIImage(named: "image3"))
                  logoImage.append(UIImage(named: "image4"))
          
          
          
          
           func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
                  if let cell = tableView.dequeueReusableCell(withIdentifier: "CustomCell") as? CustomCell{
                     cell.iconImage.image = self.logoImage[indexPath.row]
                      return cell
                  }
                  return UITableViewCell()
              }
      

      【讨论】:

        【解决方案6】:

        来自 Apple 的文档:init(type:)

        【讨论】:

        • 你看到你所指的类型列表了吗?它不包括所询问的任何图标。
        • 它们是唯一可用的 UIButton 类型。
        • 是的......所以不是这个特定问题的解决方案。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-07-07
        • 2017-02-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多