简体   繁体   中英

Multiple Lines in UILabel not showing full text

In my code (Swift 2.0 iOS 9), I've created a UIScrollView and have added a UILabel to the ScrollView to show a large set of text. The text is loaded through viewDidLoad() and is loaded from a file in the bundle.

I have used numberOfLines = 0 and label.lineBreakMode = .ByWordWrapping but only 8 lines of text show. Below the code, you will see a image of the result of the code. I have given color to the UILabel and UIScrollView to show their bounds.

override func viewDidLoad() {
    super.viewDidLoad()
    self.configureView()
    let sv = UIScrollView(frame: self.view.bounds)
    sv.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
    self.view.addSubview(sv)
    sv.backgroundColor = UIColor.greenColor()
    var y: CGFloat = 10
    let file = detailItem as! String
    if let sectionsFile = NSBundle.mainBundle().pathForResource(file, ofType: "txt") {
        if let sectionText = try? String(contentsOfFile: sectionsFile, usedEncoding: nil) {
            let label = UILabel()
            label.numberOfLines = 0
            label.text = sectionText
            label.sizeToFit()
            label.frame.origin = CGPointMake(10,y)
            sv.addSubview(label)
            y += label.bounds.size.height + 10
            label.lineBreakMode = .ByWordWrapping
            label.frame.size.width = self.view.bounds.size.width - 20
            label.backgroundColor = UIColor.yellowColor()
            label.autoresizingMask = .FlexibleWidth
        }
        var sz = sv.bounds.size
        sz.height = y
        sv.contentSize = sz
    }
}

This is the results of the code: http://i.stack.imgur.com/Zh4En.png

What do I need to do to allow all of the text to show? Alternatively, is there a better way to accomplish the same goal of presenting informational text?

Looking at your code, you are calling sizeToFit to make the label size itself, but few lines down you set width of your label's frame to a certain value, while the height stays the same. The new width is likely smaller than the one label gives itself during sizeToFit call, and that's the reason some of your text didin't fit.

Try this:

let desiredLabelWidth = self.view.bounds.size.width - 20
let size = label.sizeThatFits(CGSize(desiredLabelWidth, CGFloat.max))
label.frame = CGRect(x: 10, y: y, width: desiredLabelWidth, height: size.height)

This asks the label for it's size with a given width, and then sets the frame accordingly.

Also in your code having autoresizing mask label.autoresizingMask = .FlexibleWidth doesn't make sense because the width will change together with the superview, but the height will not, so the new size of your label will not match the text it has.

You need to 'justify' your text, just like you would in Microsoft Word!

You need to use NSMutableParagraphStyle in parallel with an NSAttributedString in order to display text as justified.

It's imperative to set NSBaselineOffsetAttributedName to 0.0.

Example code

let sampleText = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."

let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.alignment = NSTextAlignment.Justified

let attributedString = NSAttributedString(string: sampleText,
    attributes: [
        NSParagraphStyleAttributeName: paragraphStyle,
        NSBaselineOffsetAttributeName: NSNumber(float: 0)
    ])

let label = UILabel()
label.attributedText = attributedString
label.numberOfLines = 0
label.frame = CGRectMake(0, 0, 400, 400)


let view = UIView()
view.frame = CGRectMake(0, 0, 400, 400)
view.addSubview(label)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM