以编程方式在 swift 中为每个枚举创建一个 UIButton

Create a UIButton for each enum case in swift programmatically

提问人:willd 提问时间:11/1/2023 最后编辑:General Grievancewilld 更新时间:11/14/2023 访问量:38

问:

我正在尝试以编程方式在 swift UIKI 中构建一个绘图应用程序,但现在我刚刚遇到了一个问题,我正在尝试创建一个调色板来交换属性,为此我创建了一个枚举并使其在函数中使用迭代,以便我能够在函数中以编程方式创建一个,但我看到的只是一个白色方块模拟器屏幕顶部UIColorPencilCaseIterable.allCasesUIButtoncreateColorButton

这是我的职能

 func createColorButton() -> [UIButton]{
        
        var buttons: [UIButton] = []
        for pencilCase in Pencil.allCases {
            let button = UIButton(frame: CGRect(x: 50, y: 50, width: 100, height: 100))
            button.backgroundColor = pencilCase.color
            button.tag = pencilCase.hashValue
            
            
            button.addTarget(self, action: #selector(buttonClicked), for: .touchUpInside)
            buttons.append(button)
        }
     return buttons
    }

蚂蚁这是我的枚举Pencil

enum Pencil: CaseIterable {
    
    case black
    case grey
    case red
    case darkblue
    case lightBlue
    case darkGreen
    case lightGreen
    case brown
    case orange
    case yellow
    case eraser
    
    init?(tag: Int) {
        switch tag {
        case 1:
          self = .black
        case 2:
          self = .grey
        case 3:
          self = .red
        case 4:
          self = .darkblue
        case 5:
          self = .lightBlue
        case 6:
          self = .darkGreen
        case 7:
          self = .lightGreen
        case 8:
          self = .brown
        case 9:
          self = .orange
        case 10:
          self = .yellow
        case 11:
          self = .eraser
        default:
          return nil
        }
      }
    // cases for penil.color 
    var color: UIColor {
      switch self {
      case .black:
        return .black
      case .grey:
        return UIColor(white: 105/255.0, alpha: 1.0)
      case .red:
        return UIColor(red: 1, green: 0, blue: 0, alpha: 1.0)
      case .darkblue:
        return UIColor(red: 0, green: 0, blue: 1, alpha: 1.0)
      case .lightBlue:
        return UIColor(red: 51/255.0, green: 204/255.0, blue: 1, alpha: 1.0)
      case .darkGreen:
        return UIColor(red: 102/255.0, green: 204/255.0, blue: 0, alpha: 1.0)
      case .lightGreen:
        return UIColor(red: 102/255.0, green: 1, blue: 0, alpha: 1.0)
      case .brown:
        return UIColor(red: 160/255.0, green: 82/255.0, blue: 45/255.0, alpha: 1.0)
      case .orange:
        return UIColor(red: 1, green: 102/255.0, blue: 0, alpha: 1.0)
      case .yellow:
        return UIColor(red: 1, green: 1, blue: 0, alpha: 1.0)
      case .eraser:
        return .white
      }
    }
}

我在UIViewController中传递该函数,但正如我所提到的,它没有像我预期的那样工作。我只看到一个“白色方块”,而不是每个 UIbuttoncreateColorButtonsecondViewControllerPencil.color

    override func viewDidLoad() {
        super.viewDidLoad()
        
      
        let buttons = createColorButton()
        for button in buttons {
                self.view.addSubview(button)
            }
        setupImageViews()
        
    }

有什么建议可以让我工作吗?

Swift 枚举 UIKIT UIBubuttonS

评论

1赞 HangarRash 11/1/2023
不要给每个按钮提供相同的框架。

答:

1赞 Duncan C 11/1/2023 #1

正如@HangerRash在他们的评论中指出的那样,您将所有按钮放在彼此之上,而不是添加任何约束来组织它们。

尝试将所有按钮插入到垂直堆栈视图中。这将排列它们,使它们在屏幕上不都处于同一位置。

(或者,您可以创建一组自动布局定位点来调整按钮的大小和间距。

我将您的代码放入一个基于 Storyboard 的项目中,该项目包含一个垂直的 UIStackView,固定到其父视图的顶部、前缘和后缘,并将堆栈视图连接到名为 .stackView

然后我像这样修改了你的函数:viewDidLoad()

    override func viewDidLoad() {
        super.viewDidLoad()
        let buttons = createColorButton()
        stackView.spacing = 5
        for button in buttons {
            stackView.addArrangedSubview(button)
            button.layer.borderWidth = 1
            button.layer.borderColor = UIColor.blue.cgColor
            button.layer.cornerRadius = 10
        }
    }

结果如下所示:

enter image description here