2016-08-25 3 views
3

В моем коде (Swift 2.0 iOS 9) я создал UIScrollView и добавил UILabel в ScrollView, чтобы показать большой набор текста. Текст загружается через viewDidLoad() и загружается из файла в комплекте.Несколько строк в UILabel, не отображающих полный текст

Я использовал numberOfLines = 0 и label.lineBreakMode = .ByWordWrapping, но только 8 строк текстового шоу. Ниже кода вы увидите изображение результата кода. Я дал цвет UILabel и UIScrollView, чтобы показать их границы.

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 
    } 
} 

Это результаты кода: http://i.stack.imgur.com/Zh4En.png

Что мне нужно сделать, чтобы весь текст, чтобы показать? В качестве альтернативы, есть ли лучший способ достичь той же цели - представить информационный текст?

+0

Вы пытались оправдать текст? это все, что вам нужно сделать imo – Woodstock

+0

, вероятно, вам нужно переместить вызов sizeToFit после другого кода изменения кадра, особенно код для обновления ширины. – Surely

+0

Есть ли у вас ограничения на этикетке? – TheValyreanGroup

ответ

2

Глядя на ваш код, вы звоните sizeToFit сделать сам размер этикетки, но несколько строк вниз вы установите ширину кадра вашего ярлыка на определенное значение, в то время как высота остается такой же. Новая ширина, вероятно, меньше, чем одна метка дает себя во время вызова sizeToFit, и именно по этой причине часть вашего текста не подходит.

Попробуйте это:

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) 

Это задает метку для его размера с заданной шириной, а затем устанавливает кадр соответствующим образом.

Также в вашем коде, имеющем авторезистирующую маску label.autoresizingMask = .FlexibleWidth, не имеет смысла, поскольку ширина будет изменяться вместе с супервидом, но высота не будет, поэтому новый размер вашей метки не будет соответствовать тексту, который у него есть.

0

Вам нужно «оправдать» свой текст, как и в Microsoft Word!

Необходимо использовать NSMutableParagraphStyle параллельно с NSAttributedString, чтобы отобразить текст как можно скорее.

Обязательно установить NSBaselineOffsetAttributedName равным 0.0.

Пример кода

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) 
+0

Мне не удалось проверить ваше решение успешно. По тому, что я собираюсь, ваш пример должен быть в состоянии стоять сам по себе, правильно? но когда я помещаю его в viewDidLoad() проекта Single View, ничего не появляется в симуляторе. Есть ли у вас какие-либо предложения? –

Смежные вопросы