diff --git a/Packages/ComposeUI/Sources/ComposeUI/Views/MainTextView.swift b/Packages/ComposeUI/Sources/ComposeUI/Views/MainTextView.swift index df47f4ff..2070e2df 100644 --- a/Packages/ComposeUI/Sources/ComposeUI/Views/MainTextView.swift +++ b/Packages/ComposeUI/Sources/ComposeUI/Views/MainTextView.swift @@ -23,19 +23,33 @@ struct MainTextView: View { 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 { 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 { ControllerView(controller: { PlaceholderController() }) .font(.system(size: fontSize)) .foregroundColor(.secondary) - .offset(x: 4, y: 8) + .offset(placeholderOffset) .accessibilityHidden(true) + .allowsHitTesting(false) } - MainWrappedTextViewRepresentable(text: $draft.text, becomeFirstResponder: $controller.mainComposeTextViewBecomeFirstResponder, updateSelection: $updateSelection, textDidChange: textDidChange) } .frame(height: effectiveHeight) .onAppear(perform: becomeFirstResponderOnFirstAppearance) @@ -62,6 +76,7 @@ fileprivate struct MainWrappedTextViewRepresentable: UIViewRepresentable { typealias UIViewType = UITextView @Binding var text: String + let backgroundColor: UIColor @Binding var becomeFirstResponder: Bool @Binding var updateSelection: ((UITextView) -> Void)? let textDidChange: (UITextView) -> Void @@ -74,10 +89,16 @@ fileprivate struct MainWrappedTextViewRepresentable: UIViewRepresentable { context.coordinator.textView = textView textView.delegate = context.coordinator textView.isEditable = true - textView.backgroundColor = .clear textView.font = UIFontMetrics.default.scaledFont(for: .systemFont(ofSize: 20)) textView.adjustsFontForContentSizeCategory = true 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 } @@ -90,6 +111,8 @@ fileprivate struct MainWrappedTextViewRepresentable: UIViewRepresentable { uiView.isEditable = isEnabled uiView.keyboardType = controller.config.useTwitterKeyboard ? .twitter : .default + uiView.backgroundColor = backgroundColor + context.coordinator.text = $text if let updateSelection {