保留拼写确认按钮,同时新增键盘完成键提交
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -221,7 +221,13 @@ final class QuizViewController: UIViewController {
|
||||
spellingView.configure(blankedWord: question.blankedWord, blankPositions: question.blankPositions)
|
||||
if config.isStudyMode {
|
||||
nextButton.isHidden = true
|
||||
spellingView.onChange = { [weak self] in
|
||||
guard let self else { return }
|
||||
spellingView.confirmButton?.isEnabled = spellingView.isComplete
|
||||
}
|
||||
spellingView.confirmButton?.isEnabled = false
|
||||
} else {
|
||||
spellingView.hideAccessoryView()
|
||||
spellingView.onChange = { [weak self] in
|
||||
guard let self else { return }
|
||||
nextButton.isEnabled = spellingView.isComplete
|
||||
@@ -232,6 +238,7 @@ final class QuizViewController: UIViewController {
|
||||
}
|
||||
spellingView.onSubmit = { [weak self] in
|
||||
guard let self else { return }
|
||||
spellingView.confirmButton?.isEnabled = false
|
||||
primaryButtonTapped()
|
||||
}
|
||||
spellingView.activate()
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user