You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS开发:如何将UILabel中指定文字替换为UITextField?

Solution to Replace Specific Text in UILabel with UITextField

Got it, I totally get your requirement—since you have multiple task scenarios where the UITextField's position varies dynamically, manual layout won't cut it. Here's a step-by-step implementation that directly replaces the target text in your UILabel with a UITextField, perfectly adapting to different positions:

Step 1: Calculate the Frame of Target Text in UILabel

First, we need to pinpoint exactly where the target text sits within the UILabel. We can use Core Text to get the precise bounding rect of the substring. Add this reusable extension to your project:

extension UILabel {
    func frameForTextRange(_ range: NSRange) -> CGRect? {
        guard let attributedText = self.attributedText else { return nil }
        
        let textStorage = NSTextStorage(attributedString: attributedText)
        let layoutManager = NSLayoutManager()
        textStorage.addLayoutManager(layoutManager)
        
        let textContainer = NSTextContainer(size: self.bounds.size)
        textContainer.lineFragmentPadding = 0
        textContainer.maximumNumberOfLines = self.numberOfLines
        textContainer.lineBreakMode = self.lineBreakMode
        layoutManager.addTextContainer(textContainer)
        
        var glyphRange = NSRange()
        layoutManager.characterRange(forGlyphRange: range, actualGlyphRange: &glyphRange)
        
        let rect = layoutManager.boundingRect(forGlyphRange: glyphRange, in: textContainer)
        // Convert to the label's local coordinate system
        return self.convert(rect, from: self)
    }
}

Step 2: Replace Target Text with UITextField

Next, write a function that locates the target substring, calculates its frame, configures a matching UITextField, and adds it to the label's superview. We'll also adjust the label's text to avoid visual overlap:

func replaceTextInLabel(_ label: UILabel, targetText: String, withTextField textField: UITextField) {
    guard let text = label.text, let range = text.range(of: targetText) else { return }
    
    // Convert Swift string range to NSRange for Core Text calculations
    let nsRange = NSRange(range, in: text)
    
    // Get the exact frame of the target text
    guard let textFrame = label.frameForTextRange(nsRange) else { return }
    
    // Match the text field's style to the label for consistency
    textField.frame = textFrame
    textField.font = label.font
    textField.textColor = label.textColor
    textField.borderStyle = .none // Adjust this if you want visible borders
    
    // Add the text field to the label's parent view to ensure proper layering
    label.superview?.addSubview(textField)
    
    // Replace the target text with spaces to prevent overlap (or use attributed text to make it transparent)
    let replacementSpaces = String(repeating: " ", count: targetText.count)
    label.text = text.replacingOccurrences(of: targetText, with: replacementSpaces)
}

Step 3: Usage Example

Call the function wherever you need to perform the replacement—works for any label and target text combination:

// Assume you have a UILabel named `taskLabel` and a UITextField named `inputField`
let targetPlaceholder = "[INPUT_HERE]" // Your specific text to replace
replaceTextInLabel(taskLabel, targetText: targetPlaceholder, withTextField: inputField)

Key Notes

  • Ensure the UILabel's superview has a valid frame or uses autolayout before calling this function—otherwise the text frame calculation might be inaccurate.
  • If your label uses attributedText, modify the replacement logic to set the target range's foreground color to clear instead of replacing with spaces.
  • This works seamlessly for multi-line labels as long as you set the correct numberOfLines property on the label.

This approach dynamically adapts to the position of your target text in any label, which is perfect for your multi-task scenario where each text field needs to sit in a unique spot!

内容的提问来源于stack exchange,提问作者Roman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:20:52