В iOS 7 sizeWithFont:
теперь устарела. Как мне теперь передать объект UIFont в метод замены sizeWithAttributes:
?
objective-c
deprecated
ios7
Джеймс Куанг
источник
источник
NSString
иUILabel
(не ВСЕГДА, но часто так), чтобы предотвратить дублирование кода и т. д., вы также можете заменить[UIFont systemFontOfSize:17.0f]
наlabel.font
- помогает обслуживание кода, ссылаясь на существующие данные, а не вводя их несколько раз, или ссылаясь на константы по всей место и т. д.boundingRectWithSize:options:attributes:context:
вместо этого, передаваяCGSizeMake(250.0f, CGFLOAT_MAX)
в большинстве случаев.Я считаю, что эта функция устарела, потому что эта серия
NSString+UIKit
функций (sizewithFont:...
и т. Д.) Основана наUIStringDrawing
библиотеке, которая не была поточно- ориентированной . Если вы попытаетесь запустить их не в главном потоке (как любая другаяUIKit
функциональность), вы получите непредсказуемое поведение. В частности, если вы запускаете функцию одновременно на нескольких потоках, это может привести к сбою приложения. Вот почему в iOS 6 они представилиboundingRectWithSize:...
метод дляNSAttributedString
. Это было построено на вершинеNSStringDrawing
библиотек и является потокобезопасным.Если вы посмотрите на новую
NSString
boundingRectWithSize:...
функцию, она запрашивает массив атрибутов так же, как иNSAttributeString
. Если бы мне пришлось угадывать, эта новаяNSString
функция в iOS 7 является просто оболочкой дляNSAttributeString
функции из iOS 6.На этой ноте, если бы вы поддерживали только iOS 6 и iOS 7, то я определенно изменил бы все ваши
NSString
sizeWithFont:...
наNSAttributeString
boundingRectWithSize
. Это избавит вас от головной боли, если у вас будет странный многопоточный угловой корпус! Вот как я перевелNSString
sizeWithFont:constrainedToSize:
:Что раньше было:
Можно заменить на:
Обратите внимание, что в документации упоминается:
Таким образом, чтобы вывести вычисленную высоту или ширину, которая будет использоваться для размеров видов, я бы использовал:
источник
Как вы можете видеть
sizeWithFont
на сайте Apple Developer, он устарел, поэтому нам нужно использоватьsizeWithAttributes
.источник
[NSObject respondsToSelector:]
метод, как здесь: stackoverflow.com/a/3863039/1226304Я создал категорию для решения этой проблемы, вот она:
Таким образом , у вас есть только найти / заменить
sizeWithFont:
с ,sizeWithMyFont:
и вы хорошо идти.источник
В iOS7 мне нужно было, чтобы логика возвращала правильную высоту для метода tableview: heightForRowAtIndexPath, но sizeWithAttributes всегда возвращает одну и ту же высоту независимо от длины строки, потому что не знает, что она будет помещена в ячейку таблицы фиксированной ширины. , Я нашел, что это прекрасно работает для меня и вычисляет правильную высоту, принимая во внимание ширину ячейки таблицы! Это основано на ответе г-на Т. выше.
источник
Многострочные метки, использующие динамическую высоту, могут требовать дополнительной информации для правильной установки размера. Вы можете использовать sizeWithAttributes с UIFont и NSParagraphStyle, чтобы указать как шрифт, так и режим перевода строки.
Вы должны определить стиль абзаца и использовать NSDictionary следующим образом:
Вы можете использовать CGSize 'AdjustSize' или CGRect как свойство rect.size.height, если вы ищете высоту.
Дополнительная информация о NSParagraphStyle здесь: https://developer.apple.com/library/mac/documentation/cocoa/reference/applicationkit/classes/NSParagraphStyle_Class/Reference/Reference.html
источник
источник
Создайте функцию, которая принимает экземпляр UILabel. и возвращает CGSize
источник
tableView.estimatedRowHeight = 68.0 tableView.rowHeight = UITableViewAutomaticDimension
Альтернативное решение-
источник
Основываясь на @bitsand, это новый метод, который я только что добавил в свою категорию NSString + Extras:
Я просто использую размер полученного кадра.
источник
Вы все еще можете использовать
sizeWithFont
. но в iOS> = 7.0 метод вызывает сбой, если строка содержит начальные и конечные пробелы или конечные строки\n
.Обрезка текста перед его использованием
Это также может относиться к
sizeWithAttributes
и[label sizeToFit]
.также, когда у вас есть
nsstringdrawingtextstorage message sent to deallocated instance
устройство iOS 7.0, оно имеет дело с этимисточник
Лучше использовать автоматические размеры (Swift):
NB: 1. Прототип UITableViewCell должен быть правильно спроектирован (для примера не забудьте установить UILabel.numberOfLines = 0 и т. Д.) 2. Удалить метод HeightForRowAtIndexPath
ВИДЕО: https://youtu.be/Sz3XfCsSb6k
источник
источник
Принятый ответ в Xamarin будет (используйте sizeWithAttributes и UITextAttributeFont):
источник
Как ответ @Ayush:
Что ж, предположим, что в 2019 году вы, вероятно, используете Swift, а
String
не Objective-c, иNSString
вот правильный способ получить размер aString
с предопределенным шрифтом:источник
источник
Вот эквивалент monotouch, если кому-то это нужно:
который можно использовать так:
источник
источник
Попробуйте этот синтаксис:
источник
В ios 7 у меня ничего не получалось. Вот что я в итоге сделал. Я помещаю это в свой пользовательский класс ячеек и вызываю метод в моем методе heightForCellAtIndexPath.
Моя ячейка похожа на ячейку описания при просмотре приложения в магазине приложений.
Сначала в раскадровке установите свой ярлык на «attributeText», установите количество строк равным 0 (это автоматически изменит размер ярлыка (только для ios 6+)) и установите для него перенос слов.
Затем я просто складываю все высоты содержимого ячейки в моем пользовательском классе ячеек. В моем случае у меня есть Метка сверху, которая всегда говорит «Описание» (_descriptionHeadingLabel), меньшая метка, которая имеет переменный размер, содержит фактическое описание (_descriptionLabel) ограничение от верхней части ячейки до заголовка (_descriptionHeadingLabelTopConstraint) , Я также добавил 3, чтобы немного растянуть дно (примерно такое же количество яблок в ячейке типа субтитров).
И в моем представлении Table View:
Вы можете изменить оператор if, чтобы он стал немного «умнее» и фактически получил идентификатор ячейки из какого-либо источника данных. В моем случае ячейки будут жестко закодированы, поскольку их будет определенное количество в определенном порядке.
источник
boundingRectWithSize
в ios 9.2 присутствуют проблемы, отличающиеся результатами от ios <9.2. Вы нашли или знаете любой другой лучший способ сделать это.