提问人:willd 提问时间:11/1/2023 最后编辑:General Grievancewilld 更新时间:11/14/2023 访问量:38
以编程方式在 swift 中为每个枚举创建一个 UIButton
Create a UIButton for each enum case in swift programmatically
问:
我正在尝试以编程方式在 swift UIKI 中构建一个绘图应用程序,但现在我刚刚遇到了一个问题,我正在尝试创建一个调色板来交换属性,为此我创建了一个枚举并使其在函数中使用迭代,以便我能够在函数中以编程方式创建一个,但我看到的只是一个白色方块模拟器屏幕顶部UIColor
Pencil
CaseIterable
.allCases
UIButton
createColorButton
这是我的职能
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中传递该函数,但正如我所提到的,它没有像我预期的那样工作。我只看到一个“白色方块”,而不是每个 UIbuttoncreateColorButton
secondViewController
Pencil.color
override func viewDidLoad() {
super.viewDidLoad()
let buttons = createColorButton()
for button in buttons {
self.view.addSubview(button)
}
setupImageViews()
}
有什么建议可以让我工作吗?
答:
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
}
}
结果如下所示:
评论