2015-06-18 2 views
0

Кажется невозможным заставить UILabel придерживаться ограничений в том, что я хочу, чтобы он был последовательно. Ограничения ведущего и конечного пространства кажутся действительно, но метка просто усекает линии вместо того, чтобы расширяться до новых строк.UILabel не надежно обертывается

please stop truncating

у меня есть numberOfLines из UILabel множества 0. Кроме того, я попытался предложение, перечисленные здесь: UILabel not wrapping text correctly sometimes (auto layout) и это, кажется, не работать надежно. Последнее, что я пробовал, - установить setContentCompressionResistancePriority на Fitted и Low, но он не работает для всего в UITableView одновременно. Фактически, в зависимости от того, обновляется ли tableview, похоже, что вся упаковка может быть отменена.

Единственная вещь, которую я пробовал, которая, казалось, хорошо работала, заключалась в том, чтобы установить preferredMaxLayoutWidth UILabel на константу. Я просто надеялся использовать его в качестве крайней меры, чтобы избежать расчета того, насколько широкая метка должна быть во время выполнения. Наверняка, есть способ, чтобы получить то, что я хочу.

+0

Выдали предпочтительную высоту? или вычислить высоту во время выполнения? –

+0

эй, вы указали ограничение высоты и ширины фиксирования – morroko

+1

, это зависит от высоты экземпляра '' UILabel' и шрифта, вероятно, этикетка последовательно обертывает текст (в конечном итоге это точно рассчитанное значение, а не только королева драмы), поэтому, возможно, обстоятельства в вашем случае на краю, когда очень незначительное изменение высоты может повлиять на конечный результат (автоматическая компоновка работает не плавает!), поэтому вам может потребоваться немного изменить макет (например, увеличить высоту на 1 балл или уменьшить размер шрифта на 5% и т. Д.), Чтобы оттолкнуть 'UILabel' из этой неуравновешенной ситуации. – holex

ответ

0

Ключ к его правильной работы было спросить мнение сбросить макет после ограничения были применены и все текст был установлен. Я просто добавил эти строки в моем обычае UITableViewCell после того как я установил данные, что ему необходимо:

//set data 
    //set constraints 

    ... 

    contentView.setNeedsLayout() 
    contentView.layoutIfNeeded() 
} 

я понял, что это решение, так как представление хранится вместо размеров представления своих первоначальных размеров кадра после того, как под воздействием их ограничений , По какой-то причине все остальные взгляды выглядели правильными, но не UILabels.

Я нашел решение в ответ размещены здесь: https://stackoverflow.com/a/13542580/1637033

+0

Но это не должно быть необходимо в iOS 8, который делает макет _automatically_ всякий раз, когда текст UILabel изменяется. – matt

0

Вы можете рассчитать высоту от выполнения UILabel в соответствии с содержанием

func heightForLabel(text:String, font:UIFont, width:CGFloat) -> CGFloat 
    { 
     let label:UILabel = UILabel(frame: CGRectMake(0, 0, width, CGFloat.max)) 
     label.numberOfLines = 0 
     label.lineBreakMode = NSLineBreakMode.ByWordWrapping 
     label.font = font 
     label.text = text 

     label.sizeToFit() 
     return label.frame.height 

    } 
+0

Это кажется действительно интенсивным, не так ли? – mango

+0

@mango Это единственный вариант, который я могу рассчитать для расчета динамической высоты по содержанию.В противном случае укажите максимальную высоту явно из раскадровки –

+0

. Я не использую раскадровку здесь. Но я попробую указать максимальную высоту, как вы предложили, когда я получу шанс. – mango

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