2013-11-06 3 views
2

Я пытаюсь создать пользовательский вид таблицы.Динамическое изменение ширины метки внутри UITableViewCell

enter image description here

Как вы можете видеть на картинке, установить ширину метки по умолчанию как 160 точки в стороне на раскадровку и изменить ширину на лету, когда таблица загружается. Я реализую это, изменяя метод делегирования «cellForRowAtIndexPath».

Так, исходя из длины даты, я устанавливаю ширину метки 1, чтобы максимально использовать недвижимость на экране телефона.

CGFloat timeStampWidth = [cell.timestamp.text sizeWithFont:cell.timestamp.font].width; 
    CGFloat ksCompanyNameLableMaxWidth = 235; 
    NSLog(@"timeStampWidth:%f", timeStampWidth); 
    CGSize companyNameLableSize = CGSizeMake((ksCompanyNameLableMaxWidth - timeStampWidth), cell.companyNameLabel.frame.size.height); 
    CGRect newFrame = cell.companyNameLabel.frame; 
    newFrame.size = companyNameLableSize; 
    cell.companyNameLabel.frame = newFrame; 

Но когда я загрузить приложение, все label1s установлены как 160 точки, установленные в раскадровке, хотя при отладке я видел мой код получить выполняется для каждой ячейки.

enter image description here

К моему удивлению, если я прокрутите вниз и прокручивать снова. Блок кода снова вызывается, и ярлык устанавливается так, как я хочу.

enter image description here

Кроме того, если переключаться между вкладками, метка снова восстанавливается в ненормальном состоянии.

enter image description here

+1

Какие-либо правила автоматического изменения размера/размещения? Какие размеры печатаются в вашем журнале? – Wain

+0

@Wain Отпечатанный размер правильный. Я думаю, что ячейка заменяется кэшированной ячейкой или каким-то другим механизмом замены. – TypingPanda

ответ

3

Это звучит как следствие автоматической компоновки - при ее использовании, вы не должны устанавливать рамки вообще, вместо этого вы должны настроить ограничения. Вы можете сделать IBOutlet для ограничения ширины вашей метки и отрегулировать ее постоянное значение в коде.

+0

Rdelmar, я использую автоматическую компоновку на одном из других контроллеров. Но у меня нет никаких ограничений на этом конкретном контроллере табличного представления. Доза имеет значение? – TypingPanda

+0

@HappyProgrammer, нет, я не думаю, что это так - автоматический макет включен для всей раскадровки или xib, а не контроллера контроллером. Если вы не устанавливаете никаких ограничений, я думаю, что система автоматически добавит их для вас во время выполнения. – rdelmar

+0

, поэтому я должен установить константу динамически для каждой ячейки? когда я пытаюсь вытащить константу из панели рассказов в код (нажав ctrl и перетащив), есть ошибка компилятора, которая говорит, что не может подключить nslayoutconstraint iboutlet, есть ли какая-нибудь идея? Спасибо – TypingPanda

0

Если вы используете автоматическую компоновку, вы можете просто установить положение x и y, а затем ничего для высоты и ширины, и метка будет правильно сама по себе соответствовать ее содержимому. Остерегайтесь, если вы используете Xibs или Storyboards, не помещайте какой-либо текст в свой ярлык в раскадровку, или он будет нуждаться в размере этого текста. Поэтому удалите текст-заполнитель из раскадровки, установите ограничения, и тогда вам будет хорошо идти.

+0

Также благодарим вас за ответ @Terry – TypingPanda

0

Вы также можете создавать и позиционировать UILabel программно, таким образом, автоматический макет iOS не будет мешать изменению вашего кадра.

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