Grant Kochmann
Grant Kochmann

Reputation: 179

How to wrap text in Swift 5

Brand new to Xcode and Swift, but I'm trying to have a headline and subheading for a news type app I'm prototyping out. I can't get the text to wrap, leaving out most of the headline and brief summary. I need it to say

Unity with purpose. Amanda Gorman and Michelle Obama Discuss Art Identity and Optimism

Amanda Gorman captivated the world when she read her poem “The Hill We Climb” at President Joe Biden and Vice President Kamala Harris’ Jan. 20 Inauguration ceremony.

All I get is:

enter image description here

Here is the code generating the labels, this is the headline but they are basically the same:

private let headlineLabel: UILabel = {
    let label = UILabel()
    label.textAlignment = .left
    label.textColor = .white
    label.font = UIFont.preferredFont(forTextStyle: .largeTitle) //Scales font automatically
    label.adjustsFontForContentSizeCategory = true //Adjusts font sized based on settings user has
    label.lineBreakMode = .byWordWrapping
    label.numberOfLines = 0
    return label
}()

I've tried setting numberOfLines = 0 as well as label.lineBreakMode = .byWordWrapping and neither seem to work.

How can I get the entire string for both the headline and subheading to be displayed?

Thanks!

Upvotes: 1

Views: 1002

Answers (1)

cheesey
cheesey

Reputation: 516

The properties that you applied to your UILabel to allow wrapping looks correct, but without seeing more of the code it's hard to tell. So I'm betting it's your horizontal layout constraints (if any). If you did not set an explicit frame to your view. Then ensure you're setting+activating vertical and horizontal constraints for your view.

// Important step to enable contraints     
label.translatesAutoresizingMaskIntoConstraints = false 

....
// Important that you add your view to the view hierarchy first before activating 

// constraints. If not this will produce a runtime error. 
self.view.addSubview(label)
....

NSLayoutConstraint.activate([
     label.leadingAnchor.contraint(equalTo: self.view.leadingAnchor)
     label.trailingAnchor.contraint(equalTo: self.view.trailingAnchor)
     label.topAnchor.contraint(equalTo: self.view.topAnchor)
])

The .activate(:) is another important step and common pitfall. Ensure you're activating your contraints!

leadingAnchor is attaching the left side of your label's frame to the left side of your parent view. trailingAnchor is doing the same thing, but for the right side.

Then finally we pin the label to the top of the parent view. You may want use .contraint(equalTo: .., constant: ..) to push your label down a little bit as well.

So, in the next update loop and when your parent view lays out the subviews. Your label's frame will be calculated based on your activated constraints. So in this case your label's frame will look something like this (x:0, y:0, width: 300, height: *height is intrinsic here) This is assuming a parent frame of (x: 0, y: 0, width: 300, height: 600)

You mentioned you're new to iOS, so I hope this info helps you in some way.

Upvotes: 1

Related Questions