Swift 4下UILabel多行显示异常及内容截断问题咨询
Hey there! Let’s work through these two UILabel headaches you’re dealing with—they’re super common in iOS dev, so I’ve got straightforward fixes for both.
If your label’s text is getting cut off and you need it to wrap across lines, you’ve got two easy paths to fix this: using code or Interface Builder (Storyboard/XIB).
Programmatic Setup
Just set a few key properties on your UILabel:
let multiLineLabel = UILabel() multiLineLabel.text = "Your long, winding text that needs to span multiple lines without getting chopped off" multiLineLabel.numberOfLines = 0 // Use 0 for unlimited lines, or set a specific number if you want a max multiLineLabel.lineBreakMode = .byWordWrapping // Makes sure breaks happen at word boundaries, not mid-word multiLineLabel.translatesAutoresizingMaskIntoConstraints = false // Don’t forget to add width constraints! // Without a fixed width or leading/trailing constraints, the label will just expand horizontally instead of wrapping NSLayoutConstraint.activate([ multiLineLabel.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 16), multiLineLabel.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -16), multiLineLabel.topAnchor.constraint(equalTo: view.topAnchor, constant: 32) ]) view.addSubview(multiLineLabel)
Interface Builder Setup
If you’re using Storyboards/XIBs:
- Select your UILabel
- Head to the Attributes Inspector (the icon that looks like a slider)
- Set Number of Lines to
0(or your desired max line count) - Set Line Break to
Word Wrap - Add leading and trailing constraints to the label’s superview (or set a fixed width) so the label knows when to wrap text
You mentioned your label isn’t wrapping to 2 lines at word boundaries like the docs say—let’s troubleshoot the most common culprits:
1. Double-Check Your Core Settings
First, make sure you’ve got these properties set correctly (either in code or IB):
let twoLineLabel = UILabel() twoLineLabel.text = "Your text that should split neatly into two lines at the nearest word boundary" twoLineLabel.numberOfLines = 2 // Explicitly set to 2—this tells the label to stop after two lines twoLineLabel.lineBreakMode = .byWordWrapping // Critical for word-boundary breaks
In IB, mirror these settings: set Number of Lines to 2 and Line Break to Word Wrap.
2. Verify Your Auto Layout Constraints
The #1 reason this fails is that the label has no width limit. If the label is allowed to expand horizontally infinitely, it’ll just show all text on one line. Fix this by:
- Adding leading and trailing constraints to the superview (with spacing, like 16pts on each side)
- Or setting a fixed width constraint if you need a specific label size
3. Check for Unbreakable Text
If your text is a single long string with no spaces (like a URL or a weirdly formatted phrase), .byWordWrapping can’t split it. In that case, you could switch to .byCharWrapping, but that’s probably not what you want. Make sure your text has spaces between words so word wrapping works as expected.
4. Content Compression Resistance
Rarely, the label’s content compression resistance priority might be too high, preventing it from wrapping. To fix this in IB:
- Select the label
- Go to the Size Inspector
- Lower the Horizontal Content Compression Resistance Priority to something like
749(below the default750of most superviews)
内容的提问来源于stack exchange,提问作者David Kramf

