visionOS: Improve Compose main text view appearance
This commit is contained in:
parent
a0eb5dc596
commit
78196e14c3
|
@ -23,19 +23,33 @@ struct MainTextView: View {
|
||||||
controller.config
|
controller.config
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private var placeholderOffset: CGSize {
|
||||||
|
#if os(visionOS)
|
||||||
|
CGSize(width: 8, height: 8)
|
||||||
|
#else
|
||||||
|
CGSize(width: 4, height: 8)
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
ZStack(alignment: .topLeading) {
|
ZStack(alignment: .topLeading) {
|
||||||
colorScheme == .dark ? config.fillColor : Color(uiColor: .secondarySystemBackground)
|
MainWrappedTextViewRepresentable(
|
||||||
|
text: $draft.text,
|
||||||
|
backgroundColor: colorScheme == .dark ? UIColor(config.fillColor) : .secondarySystemBackground,
|
||||||
|
becomeFirstResponder: $controller.mainComposeTextViewBecomeFirstResponder,
|
||||||
|
updateSelection: $updateSelection,
|
||||||
|
textDidChange: textDidChange
|
||||||
|
)
|
||||||
|
|
||||||
if draft.text.isEmpty {
|
if draft.text.isEmpty {
|
||||||
ControllerView(controller: { PlaceholderController() })
|
ControllerView(controller: { PlaceholderController() })
|
||||||
.font(.system(size: fontSize))
|
.font(.system(size: fontSize))
|
||||||
.foregroundColor(.secondary)
|
.foregroundColor(.secondary)
|
||||||
.offset(x: 4, y: 8)
|
.offset(placeholderOffset)
|
||||||
.accessibilityHidden(true)
|
.accessibilityHidden(true)
|
||||||
|
.allowsHitTesting(false)
|
||||||
}
|
}
|
||||||
|
|
||||||
MainWrappedTextViewRepresentable(text: $draft.text, becomeFirstResponder: $controller.mainComposeTextViewBecomeFirstResponder, updateSelection: $updateSelection, textDidChange: textDidChange)
|
|
||||||
}
|
}
|
||||||
.frame(height: effectiveHeight)
|
.frame(height: effectiveHeight)
|
||||||
.onAppear(perform: becomeFirstResponderOnFirstAppearance)
|
.onAppear(perform: becomeFirstResponderOnFirstAppearance)
|
||||||
|
@ -62,6 +76,7 @@ fileprivate struct MainWrappedTextViewRepresentable: UIViewRepresentable {
|
||||||
typealias UIViewType = UITextView
|
typealias UIViewType = UITextView
|
||||||
|
|
||||||
@Binding var text: String
|
@Binding var text: String
|
||||||
|
let backgroundColor: UIColor
|
||||||
@Binding var becomeFirstResponder: Bool
|
@Binding var becomeFirstResponder: Bool
|
||||||
@Binding var updateSelection: ((UITextView) -> Void)?
|
@Binding var updateSelection: ((UITextView) -> Void)?
|
||||||
let textDidChange: (UITextView) -> Void
|
let textDidChange: (UITextView) -> Void
|
||||||
|
@ -74,10 +89,16 @@ fileprivate struct MainWrappedTextViewRepresentable: UIViewRepresentable {
|
||||||
context.coordinator.textView = textView
|
context.coordinator.textView = textView
|
||||||
textView.delegate = context.coordinator
|
textView.delegate = context.coordinator
|
||||||
textView.isEditable = true
|
textView.isEditable = true
|
||||||
textView.backgroundColor = .clear
|
|
||||||
textView.font = UIFontMetrics.default.scaledFont(for: .systemFont(ofSize: 20))
|
textView.font = UIFontMetrics.default.scaledFont(for: .systemFont(ofSize: 20))
|
||||||
textView.adjustsFontForContentSizeCategory = true
|
textView.adjustsFontForContentSizeCategory = true
|
||||||
textView.textContainer.lineBreakMode = .byWordWrapping
|
textView.textContainer.lineBreakMode = .byWordWrapping
|
||||||
|
|
||||||
|
#if os(visionOS)
|
||||||
|
textView.borderStyle = .roundedRect
|
||||||
|
// yes, the X inset is 4 less than the placeholder offset
|
||||||
|
textView.textContainerInset = UIEdgeInsets(top: 8, left: 4, bottom: 8, right: 4)
|
||||||
|
#endif
|
||||||
|
|
||||||
return textView
|
return textView
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -90,6 +111,8 @@ fileprivate struct MainWrappedTextViewRepresentable: UIViewRepresentable {
|
||||||
uiView.isEditable = isEnabled
|
uiView.isEditable = isEnabled
|
||||||
uiView.keyboardType = controller.config.useTwitterKeyboard ? .twitter : .default
|
uiView.keyboardType = controller.config.useTwitterKeyboard ? .twitter : .default
|
||||||
|
|
||||||
|
uiView.backgroundColor = backgroundColor
|
||||||
|
|
||||||
context.coordinator.text = $text
|
context.coordinator.text = $text
|
||||||
|
|
||||||
if let updateSelection {
|
if let updateSelection {
|
||||||
|
|
Loading…
Reference in New Issue