保留拼写确认按钮,同时新增键盘完成键提交

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-07-21 21:13:09 +08:00
parent e176a83b61
commit 0df02d487e
2 changed files with 43 additions and 0 deletions
@@ -3,6 +3,7 @@ import UIKit
final class SpellingInputView: UIView, UITextFieldDelegate {
var onChange: (() -> Void)?
var onSubmit: (() -> Void)?
private(set) var confirmButton: UIButton?
private let hiddenField = UITextField()
private let stack = UIStackView()
@@ -58,6 +59,36 @@ final class SpellingInputView: UIView, UITextFieldDelegate {
hiddenField.frame = .zero
addSubview(hiddenField)
let accessory = UIView()
accessory.frame = CGRect(x: 0, y: 0, width: 0, height: 74)
accessory.autoresizingMask = .flexibleWidth
accessory.backgroundColor = .clear
var glassConfig = UIButton.Configuration.glass()
glassConfig.title = "确认"
glassConfig.cornerStyle = .fixed
glassConfig.background.cornerRadius = 25
glassConfig.baseForegroundColor = .label
glassConfig.titleTextAttributesTransformer = UIConfigurationTextAttributesTransformer { incoming in
var outgoing = incoming
outgoing.font = .systemFont(ofSize: 16, weight: .semibold)
return outgoing
}
let glassButton = UIButton(configuration: glassConfig)
confirmButton = glassButton
glassButton.addAction(UIAction { [weak self] _ in
self?.onSubmit?()
}, for: .touchUpInside)
glassButton.translatesAutoresizingMaskIntoConstraints = false
accessory.addSubview(glassButton)
NSLayoutConstraint.activate([
glassButton.trailingAnchor.constraint(equalTo: accessory.trailingAnchor, constant: -15),
glassButton.topAnchor.constraint(equalTo: accessory.topAnchor, constant: 12),
glassButton.widthAnchor.constraint(equalToConstant: 80),
glassButton.heightAnchor.constraint(equalToConstant: 50)
])
hiddenField.inputAccessoryView = accessory
addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(reactivate)))
}
@@ -97,6 +128,11 @@ final class SpellingInputView: UIView, UITextFieldDelegate {
refreshBoxes()
}
func hideAccessoryView() {
confirmButton?.isHidden = true
hiddenField.inputAccessoryView = nil
}
func showResultState(correct: Bool) {
let color = correct ? Theme.Color.correct : Theme.Color.wrong
for position in blankPositions {