2015-12-01 2 views
1

Что у меня возникают:способов изменить алгоритм, чтобы установить высоту строки в UITableView

  • var size: CGFloat = 21.0
  • TableView с действиями cellForRowAtIndexPath и heightForRowAtIndexPath

В cellForRowAtIndexPath I Установка строки в TextLabel и сохранение textLabel.frame.height в размер vairable

Тогда в heightForRowAtIndexPath Я возвращаюсь размер переменной

Проблема заключается в том, что heightForRow выполняется перед cellForRow и мне нужно перезагрузить представление таблицы два раза. Но если есть много ячеек - некоторые из невидимых не будут перезагружены, а их размер не будет изменяться.

Как я могу заставить этот алгоритм работать правильно во всех случаях без перезагрузки дважды?

Update:

Вот как моя метка устанавливается autolayout в прототипе клетки

Он не имеет нижнего ограничения

Update 2:

Здесь - файл проекта sendspace.com/file/816z35

+2

Вы можете рассчитать высоту ячейки в 'heightForRowAtIndexPath' вместо в 'cellForRowAtIndexPath' – anhtu

+0

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

+0

@HrenoHrenovich, почему бы и нет, вы можете вычислить высоту 'NSString' и вернуть ее в' heightForRowAtIndexPath'. – rckoenes

ответ

1

Вы должны рассчитать высоту в методе делегата UITableView.

Один из подходов состоит в том, чтобы вручную получить размер, вызвав sizeWithAttributes: на вашей строке (NSString).

Что-то вроде этого:

var texts = ["some text 1", "some text 2"] 
let attributes = [NSFontAttributeName: UIFont.systemFontOfSize(15)] 

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
    let string = texts[indexPath.row] as NSString 
    return string.sizeWithAttributes(attributes).height 
} 

Или лучше подход (производительность мудрая) было бы вычислить высоту, когда вы сначала получить тексты для клеток. Что-то вроде этого:

let attributes = [NSFontAttributeName: UIFont.systemFontOfSize(15)] 
var sizes = [CGFloat]() 
var texts: [String] = ["some text 1", "some text 2"] { 
    didSet { 
     sizes = [] 
     for text in texts { 
      let string = text as NSString 
      let height = string.sizeWithAttributes(attributes).height 
      sizes.append(height) 
     } 
    } 
} 

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
    return sizes[indexPath.row] 
} 

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


UPDATE

Чтобы получить высоту мульти-линии с ограничениями в определенные ширины вы можете сделать это:

let string = NSAttributedString(string: string, attributes: attributes) 
let size = string.boundingRectWithSize(CGSizeMake(YOUR_WIDTH, CGFloat.max), options: .UsesLineFragmentOrigin, context: nil) 
let height = size.height 
+0

Большое вам спасибо за то, что вы пытаетесь, но это не работает должным образом в моем случае. Я обновил сообщение, чтобы показать настройки ярлыков. В зависимости от них строка становится многострочной, а ее высота изменяется на те, которые должны быть установлены в строке height –

+0

@HrenoHrenovich см. Обновление к моему ответу. Это просто он часть, где вы получаете многострочную высоту метки, не забудьте добавить к ней свое основное значение константы ограничения, получить фактический размер ячейки и изменить «YOUR_WIDTH» на ширину ячейки минус слева и справа ограничение. –

+0

Я передам вашу информацию через, спасибо. Я буду очень благодарен, если вы посмотрите на файлы проекта, которые я написал в комментариях к моим вопросам некоторое время :) –

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