W iOS 7 sizeWithFont:
jest teraz przestarzały. Jak teraz przekazać obiekt UIFont do metody zamiany sizeWithAttributes:
?
objective-c
deprecated
ios7
James Kuang
źródło
źródło
NSString
iUILabel
(nie zawsze tak jest, ale często tak), aby zapobiec powielony kod / etc, można również wymienić[UIFont systemFontOfSize:17.0f]
zlabel.font
- ułatwia utrzymanie kodu poprzez odniesienie istniejących danych w porównaniu z wami wpisanie go wielokrotnie lub odwołanie stałych całego miejsce itp.boundingRectWithSize:options:attributes:context:
, przekazującCGSizeMake(250.0f, CGFLOAT_MAX)
w większości przypadków.Myślę, że ta funkcja była przestarzała, ponieważ ta seria
NSString+UIKit
funkcji (sizewithFont:...
itp.)UIStringDrawing
Była oparta na bibliotece, co nie było bezpieczne dla wątków. Jeśli spróbujesz uruchomić je nie w głównym wątku (jak każda innaUIKit
funkcja), otrzymasz nieprzewidziane zachowania. W szczególności, jeśli uruchomiłeś funkcję na wielu wątkach jednocześnie, prawdopodobnie spowoduje to awarię aplikacji. Właśnie dlatego w iOS 6 wprowadziliboundingRectWithSize:...
metodęNSAttributedString
. Został on zbudowany naNSStringDrawing
bibliotekach i jest bezpieczny dla wątków.Jeśli spojrzysz na nową
NSString
boundingRectWithSize:...
funkcję, poprosi ona o tablicę atrybutów w taki sam sposób jakNSAttributeString
. Gdybym musiał zgadywać, ta nowaNSString
funkcja w iOS 7 jest jedynie opakowaniemNSAttributeString
funkcji z iOS 6.W tej notatce, jeśli wspierasz tylko iOS 6 i iOS 7, zdecydowanie zmieniłbym wszystkie twoje
NSString
sizeWithFont:...
naNSAttributeString
boundingRectWithSize
. Zaoszczędzi ci dużo bólu głowy, jeśli zdarzy ci się mieć dziwną, wielowątkową obudowę narożną! Oto jak przekonwertowałemNSString
sizeWithFont:constrainedToSize:
:Co kiedyś:
Można zastąpić:
Uwaga: w dokumentacji wspomniano:
Aby wyciągnąć obliczoną wysokość lub szerokość, która ma zostać użyta do zmiany rozmiaru widoków, użyłbym:
źródło
Jak widać
sizeWithFont
na stronie Apple Developer, jest on przestarzały, więc musimy go użyćsizeWithAttributes
.źródło
[NSObject respondsToSelector:]
metody takiej jak tutaj: stackoverflow.com/a/3863039/1226304Utworzyłem kategorię, aby poradzić sobie z tym problemem, oto ona:
W ten sposób można tylko trzeba znaleźć / zastąpić
sizeWithFont:
zsizeWithMyFont:
i jesteś dobry, aby przejść.źródło
W iOS7 potrzebowałem logiki, aby zwrócić poprawną wysokość dla widoku tabeli: heightForRowAtIndexPath, ale sizeWithAttributes zawsze zwraca tę samą wysokość niezależnie od długości łańcucha, ponieważ nie wie, że zostanie umieszczony w komórce tabeli o stałej szerokości . Uważam, że działa to dla mnie świetnie i oblicza prawidłową wysokość, biorąc pod uwagę szerokość komórki tabeli! Jest to oparte na powyższej odpowiedzi pana T.
źródło
Etykiety wieloliniowe wykorzystujące dynamiczną wysokość mogą wymagać dodatkowych informacji, aby prawidłowo ustawić rozmiar. Możesz użyć sizeWithAttributes z UIFont i NSParagraphStyle, aby określić zarówno czcionkę, jak i tryb podziału linii.
Zdefiniowałbyś styl akapitowy i używałeś NSDictionary w następujący sposób:
Jeśli szukasz wysokości, możesz użyć CGSize 'AdjustSize' lub CGRect jako właściwości rect.size.height.
Więcej informacji na temat NSParagraphStyle tutaj: https://developer.apple.com/library/mac/documentation/cocoa/reference/applicationkit/classes/NSParagraphStyle_Class/Reference/Reference.html
źródło
źródło
Utwórz funkcję, która pobiera instancję UILabel. i zwraca CGSize
źródło
tableView.estimatedRowHeight = 68.0 tableView.rowHeight = UITableViewAutomaticDimension
Alternatywne rozwiązanie
źródło
Opierając się na @bitsand, jest to nowa metoda, którą właśnie dodałem do mojej kategorii NSString + Dodatki:
Po prostu używam rozmiaru wynikowej ramki.
źródło
Nadal możesz używać
sizeWithFont
. ale w iOS> = 7.0 metoda powoduje zawieszanie się, jeśli ciąg znaków zawiera spacje początkowe i końcowe oraz linie końcowe\n
.Przycinanie tekstu przed użyciem
Dotyczy to również
sizeWithAttributes
i[label sizeToFit]
.również za każdym razem, gdy masz
nsstringdrawingtextstorage message sent to deallocated instance
urządzenie z iOS 7.0, zajmuje się tym.źródło
Lepsze wykorzystanie wymiarów automatycznych (Swift):
Uwaga: 1. Prototyp UITableViewCell powinien być odpowiednio zaprojektowany (na przykład nie zapomnij ustawić UILabel.numberOfLines = 0 itd.) 2. Usuń metodę HeightForRowAtIndexPath
WIDEO: https://youtu.be/Sz3XfCsSb6k
źródło
źródło
Zaakceptowana odpowiedź w Xamarin będzie (użyj sizeWithAttributes i UITextAttributeFont):
źródło
Jako odpowiedź @Ayush:
Załóżmy, że w 2019+ prawdopodobnie używasz Swift i
String
zamiast Objective-c, aNSString
oto poprawny sposób uzyskania rozmiaruString
z predefiniowaną czcionką:źródło
źródło
Oto odpowiednik monotouch, jeśli ktoś tego potrzebuje:
które mogą być użyte w ten sposób:
źródło
źródło
Wypróbuj tę składnię:
źródło
W iOS 7 nic z tego nie działało. Oto, co ostatecznie zrobiłem. Umieszczam to w mojej niestandardowej klasie komórek i wywołuję metodę w metodzie heightForCellAtIndexPath.
Moja komórka wygląda podobnie do komórki opisu podczas przeglądania aplikacji w sklepie z aplikacjami.
Najpierw w serii ujęć ustaw etykietę na „atrybutowany tekst”, ustaw liczbę wierszy na 0 (która automatycznie zmieni rozmiar etykiety (tylko iOS 6+)) i ustaw zawijanie słów.
Następnie po prostu sumuję wszystkie wysokości zawartości komórki w mojej niestandardowej klasie komórek. W moim przypadku mam u góry etykietę, która zawsze mówi „Opis” (_descriptionHeadingLabel), mniejszą etykietę o zmiennej wielkości, która zawiera rzeczywisty opis (_descriptionLabel) ograniczenie od góry komórki do nagłówka (_descriptionHeadingLabelTopConstraint) . Dodałem również 3, aby nieco spuścić trochę na dole (mniej więcej tyle samo jabłek umieszcza w komórce typu napisów).
I w moim widoku tabeli delegat:
Możesz zmienić instrukcję if, aby była nieco „inteligentniejsza” i faktycznie pobierała identyfikator komórki z jakiegoś źródła danych. W moim przypadku komórki będą zakodowane na stałe, ponieważ będzie ich stała liczba w określonej kolejności.
źródło
boundingRectWithSize
w ios 9.2 obecne problemy, to wyniki inne niż ios <9.2. Znalazłeś lub znasz inny najlepszy sposób na zrobienie tego.