拼写输入框支持水平滚动,避免长单词被压缩
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -20,18 +20,31 @@ final class SpellingInputView: UIView, UITextFieldDelegate {
|
|||||||
|
|
||||||
override init(frame: CGRect) {
|
override init(frame: CGRect) {
|
||||||
super.init(frame: frame)
|
super.init(frame: frame)
|
||||||
|
|
||||||
|
let scrollView = UIScrollView()
|
||||||
|
scrollView.showsHorizontalScrollIndicator = false
|
||||||
|
scrollView.showsVerticalScrollIndicator = false
|
||||||
|
addSubview(scrollView)
|
||||||
|
scrollView.translatesAutoresizingMaskIntoConstraints = false
|
||||||
|
NSLayoutConstraint.activate([
|
||||||
|
scrollView.topAnchor.constraint(equalTo: topAnchor),
|
||||||
|
scrollView.bottomAnchor.constraint(equalTo: bottomAnchor),
|
||||||
|
scrollView.leadingAnchor.constraint(equalTo: leadingAnchor),
|
||||||
|
scrollView.trailingAnchor.constraint(equalTo: trailingAnchor)
|
||||||
|
])
|
||||||
|
|
||||||
stack.axis = .horizontal
|
stack.axis = .horizontal
|
||||||
stack.spacing = 6
|
stack.spacing = 6
|
||||||
stack.alignment = .center
|
stack.alignment = .center
|
||||||
stack.isUserInteractionEnabled = true
|
stack.isUserInteractionEnabled = true
|
||||||
addSubview(stack)
|
scrollView.addSubview(stack)
|
||||||
stack.translatesAutoresizingMaskIntoConstraints = false
|
stack.translatesAutoresizingMaskIntoConstraints = false
|
||||||
NSLayoutConstraint.activate([
|
NSLayoutConstraint.activate([
|
||||||
stack.topAnchor.constraint(equalTo: topAnchor),
|
stack.topAnchor.constraint(equalTo: scrollView.contentLayoutGuide.topAnchor),
|
||||||
stack.bottomAnchor.constraint(equalTo: bottomAnchor),
|
stack.bottomAnchor.constraint(equalTo: scrollView.contentLayoutGuide.bottomAnchor),
|
||||||
stack.centerXAnchor.constraint(equalTo: centerXAnchor),
|
stack.leadingAnchor.constraint(equalTo: scrollView.contentLayoutGuide.leadingAnchor),
|
||||||
stack.leadingAnchor.constraint(greaterThanOrEqualTo: leadingAnchor),
|
stack.trailingAnchor.constraint(equalTo: scrollView.contentLayoutGuide.trailingAnchor),
|
||||||
stack.trailingAnchor.constraint(lessThanOrEqualTo: trailingAnchor)
|
stack.heightAnchor.constraint(equalTo: scrollView.frameLayoutGuide.heightAnchor)
|
||||||
])
|
])
|
||||||
|
|
||||||
hiddenField.delegate = self
|
hiddenField.delegate = self
|
||||||
@@ -126,17 +139,9 @@ final class SpellingInputView: UIView, UITextFieldDelegate {
|
|||||||
|
|
||||||
private func rebuildBoxes() {
|
private func rebuildBoxes() {
|
||||||
stack.arrangedSubviews.forEach { $0.removeFromSuperview() }
|
stack.arrangedSubviews.forEach { $0.removeFromSuperview() }
|
||||||
let count = CGFloat(max(chars.count, 1))
|
let boxWidth: CGFloat = 32
|
||||||
let available = (window?.screen.bounds.width ?? 390) - 32
|
let fontSize: CGFloat = 20
|
||||||
var spacing: CGFloat = 6
|
stack.spacing = 6
|
||||||
var boxWidth = (available - spacing * (count - 1)) / count
|
|
||||||
if boxWidth < 16 {
|
|
||||||
spacing = 3
|
|
||||||
boxWidth = (available - spacing * (count - 1)) / count
|
|
||||||
}
|
|
||||||
boxWidth = min(36, boxWidth)
|
|
||||||
stack.spacing = spacing
|
|
||||||
let fontSize = min(22, max(12, boxWidth * 0.62))
|
|
||||||
boxViews = chars.enumerated().map { index, ch in
|
boxViews = chars.enumerated().map { index, ch in
|
||||||
let box = makeBox(fontSize: fontSize)
|
let box = makeBox(fontSize: fontSize)
|
||||||
box.tag = index
|
box.tag = index
|
||||||
|
|||||||
Reference in New Issue
Block a user