2017-02-13 3 views
2
  • Я строю UITableView, у которого будет несколько вертикальных/горизонтальных рядов.
  • Первый горизонтальный ряд будет заголовком, а остальные - значениями.
  • Поскольку я не знаю заранее самого большого значения (длины) одного элемента данных, я не могу предсказать максимальную ширину вертикальной строки.
  • Я собираюсь предоставить минимальную ширину (равную ширине UILabel, которая будет служить заголовком в первой горизонтальной строке) и оценить максимально возможное значение на основе данного набора данных. Для этого я должен знать, какая из созданных волей-лейблов будет иметь самый большой IntrinsicSize.

Проблема заключается в том, что я должен знать, что значение перед я начать строить свои клетки, а это значит, что я должен создать все этикетки, прежде чем начать строительство, так что я должен создать каждый ярлык дважды, один раз перед тем, как построить таблицу (чтобы узнать, будет ли она самой большой в вертикальной строке) и один раз для фактического размещения ее в обычном UITableViewCell.Как узнать, какая UILabel из данного набора будет иметь наибольшую ширину, не создавая их?

  1. Самое главное, есть ли лучший способ сделать это?
  2. Если нет, как решить проблему неэффективности создания каждой метки дважды?

забыл упомянуть, что все должно быть сделано из кода, так как я использую Xamarin.iOS и имеет практически непригодный для использования .xib редактора.

ответ

2

Предполагая, что вы можете найти длинного строку в наборе данных, вы можете использовать NSString.GetSizeUsingAttributes, чтобы получить ширину и высоту, основанную на UIFont, что вы будете использовать, чтобы сделать ваши UILabel.

var aFont = UIFont.GetPreferredFontForTextStyle(UIFontTextStyle.Body); 
var attributes = new UIStringAttributes 
{ 
    Font = aFont 
}; 
var rect = (new NSString("The string with the most characters...")).GetSizeUsingAttributes(attributes); 
Console.WriteLine($"String width is {rect.Width} when using {aFont.Name}"); 

Добавьте несколько пикселей в результате, если вы добавляете границы, отступы и т.д. ... к вашему UILabel.

Примечание: насколько длинна строка в вашем наборе данных, I крыло оно и просто используйте количество символов в качестве указателя. Да, использование непропорциональных шрифтов может привести к более короткой ширине со строкой большего количества символов, сравнимой с другой «более длинной» строкой, но альтернативой является проверка результатов CGRect каждой строки, и это редко бывает практичным или необходимым ...

+0

Самая большая строка может быть не самой большой. Но я могу создать 'NSString' для каждого из них и сравнить их, правильно? Будет ли это огромной тратой, скажем, парой сотен лейблов? – nicks

+0

@NikaGamkrelidze. Конечно, вы могли бы, но GC накладные расходы на создание сотен экземпляров «NSString» вряд ли стоили бы этого ... *** практически говоря, хватая строку с большинством символов и использую ее как ваш ' UILabel' width .... – SushiHangover

+0

другой вариант, похоже, создает все метки и сохраняет их в словаре для дальнейшего использования. как только я создам все из них, найдите самый большой, а затем используйте эту информацию, когда выкладываете их. Я мог бы хранить эти словари в TableSource. Что Вы думаете об этом? – nicks

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