如何修复被圆角覆盖的TextField?关于Swift光标位置设置的疑问
Hey there! Let's sort out your problems with text offset and cursor handling—your placeholder hack works but isn't ideal, and I'll clear up that confusing code snippet you mentioned.
1. Proper Way to Add Left Padding (No More Placeholder Spaces!)
Using spaces in your placeholder is a quick fix, but it's fragile (e.g., if the placeholder text changes, you have to adjust spaces, and it doesn't align input text perfectly). Here's the right approach for both controls:
For UITextField:
Use a leftView to create consistent padding that applies to both the placeholder and user input:
override func viewDidLoad() { super.viewDidLoad() // Create a padding view with your desired width let leftPadding = UIView(frame: CGRect(x: 0, y: 0, width: 20, height: firstNameTextField.frame.height)) firstNameTextField.leftView = leftPadding firstNameTextField.leftViewMode = .always // Show padding always, not just when editing }
For UITextView:
Use textContainerInset to adjust the text's inner margins—this works for both regular text and the built-in placeholder (iOS 12+):
override func viewDidLoad() { super.viewDidLoad() // Adjust left (and other) insets as needed firstNameTextView.textContainerInset = UIEdgeInsets(top: 8, left: 20, bottom: 8, right: 20) // Optional: If you're using a custom placeholder, make sure its frame matches this inset }
2. Clarifying That "Cursor Position" Code Snippet
The function you referenced:
func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool { // ... }
Has nothing to do with cursor positions! This is a UITextViewDelegate method that handles link taps—it lets you decide if the user should be allowed to interact with URLs in the text view.
Correct Cursor Position Handling
To get or set the cursor (or selection) position in a UITextView/UITextField:
- Get current cursor position:
let cursorPosition = textView.selectedRange.location // If text is selected, selectedRange.length will be > 0; location is the start of the selection - Set cursor to a specific position:
// Move cursor to the start of the text textView.selectedRange = NSRange(location: 0, length: 0) // Move cursor to the end of the text textView.selectedRange = NSRange(location: textView.text.count, length: 0) // Move cursor to position 5 (0-indexed) textView.selectedRange = NSRange(location: 5, length: 0)
That's all you need for reliable cursor control!
内容的提问来源于stack exchange,提问作者s15o

