Jak zwrócić wielowierszowy tekst CGSize z nowej metody sizeWithAttributes systemu iOS 7?
Chciałbym, aby to dawało takie same wyniki, jak sizeWithFont: constrainedToSize.
NSString *text = @"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus eu urna quis lacus imperdiet scelerisque a nec neque. Mauris eget feugiat augue, vitae porttitor mi. Curabitur vitae sollicitudin augue. Donec id sapien eros. Proin consequat tellus in vehicula sagittis. Morbi sed felis a nibh hendrerit hendrerit. Lorem ipsum dolor sit."
CGSize textSize = [text sizeWithAttributes:@{ NSFontAttributeName : [UIFont fontWithName:@"HelveticaNeue-Light" size:16.0] }];
Ta metoda tworzy wysokość tylko dla jednego wiersza tekstu.
objective-c
ios7
morcutt
źródło
źródło
Odpowiedzi:
cóż, możesz spróbować tego:
NSDictionary *attributes = @{NSFontAttributeName: [UIFont fontWithName:@"HelveticaNeue" size:14]}; // NSString class method: boundingRectWithSize:options:attributes:context is // available only on ios7.0 sdk. CGRect rect = [textToMeasure boundingRectWithSize:CGSizeMake(width, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin attributes:attributes context:nil];
źródło
@{...}
. Jak to jest nazywane?sizeWithFont:constrainedToSize:
metoda, która została wycofana. Apple musi nas naprawdę nienawidzić. W każdym razie +1.MAXFLOAT
zamiastCGFLOAT_MAX
?var size = textToMeasure.boundingRectWithSize( CGSizeMake(width, CGFloat.max), options: NSStringDrawingOptions.UsesLineFragmentOrigin, attributes:attrs, context:nil).size
Oto jak to zrobiłem:
// Get a font to draw it in UIFont *font = [UIFont boldSystemFontOfSize: 28]; CGRect textRect; NSDictionary *attributes = @{NSFontAttributeName: font}; // How big is this string when drawn in this font? textRect.size = [text sizeWithAttributes:attributes]; // Draw the string [text drawInRect:textRect withAttributes:attributes];
źródło
Swift 2.3:
let attributes = [NSFontAttributeName:UIFont(name: "HelveticaNeue", size: 14)] let rect = NSString(string: textToMeasure).boundingRectWithSize( CGSizeMake(width, CGFLOAT_MAX), options: NSStringDrawingOptions.UsesLineFragmentOrigin, attributes: attributes, context: nil)
Swift 4:
let attributes = [NSFontAttributeName:UIFont(name: "HelveticaNeue", size: 14)] let rect = NSString(string: textToMeasure).boundingRect( with: CGSize(width: width, height: CGFloat.greatestFiniteMagnitude), options: NSStringDrawingOptions.usesLineFragmentOrigin, attributes: attributes as [NSAttributedString.Key : Any], context: nil)
źródło
Oto moja metoda radzenia sobie w obu sytuacjach, idzie w
NSString
kategorii.- (CGSize) sizeWithFontOrAttributes:(UIFont *) font { if (IS_IOS7) { NSDictionary *fontWithAttributes = @{NSFontAttributeName:font}; return [self sizeWithAttributes:fontWithAttributes]; } else { return [self sizeWithFont:font]; } }
źródło
W przypadku platformy Xamarin.iOS:
UIFont descriptionLabelFont = UIFont.SystemFontOfSize (11); NSString textToMeasure = (NSString)DescriptionLabel.Text; CGRect labelRect = textToMeasure.GetBoundingRect ( new CGSize(this.Frame.Width, nfloat.MaxValue), NSStringDrawingOptions.UsesLineFragmentOrigin, new UIStringAttributes () { Font = descriptionLabelFont }, new NSStringDrawingContext () );
źródło
Jeśli masz ustawiony tekst, czcionkę, numberOfLines i szerokość etykiety, ta metoda zwraca rozmiar etykiety:
myLabel.numberOfLines = 0; CGSize size = [myLabel sizeThatFits:CGSizeMake(myLabel.frame.size.width, CGFLOAT_MAX)];`
źródło
Alternatywnie, jeśli patrzysz
UITextView
, zawsze możesz użyćNSLayoutManager
metody:CGSize textSize = [textView.layoutManager usedRectForTextContainer:textView.textContainer].size;
Wysokość linii dla danej czcionki można również znaleźć poprzez:
UIFont *font; CGFloat lineHeight = font.lineHeight;
źródło
[Jako nowy użytkownik nie mogę opublikować komentarza do odpowiedzi @ testing, ale aby uczynić jego odpowiedź (dla xamarin.ios) bardziej użyteczną]
Możemy zwrócić CGRect i użyć parametru wysokości tylko dla elementu gui, na który celujemy UIButton itp. Przekazywanie dowolnych parametrów, których potrzebujemy, jak poniżej
public CGRect GetRectForString(String strMeasure, int fontSize, nfloat guiItemWidth) { UIFont descriptionLabelFont = UIFont.SystemFontOfSize (fontSize); NSString textToMeasure = (NSString)strMeasure; CGRect labelRect = textToMeasure.GetBoundingRect ( new CGSize(guiItemWidth, nfloat.MaxValue), NSStringDrawingOptions.UsesLineFragmentOrigin, new UIStringAttributes () { Font = descriptionLabelFont }, new NSStringDrawingContext () ); return labelRect; }
header_Revision.Frame = new CGRect (5 , verticalAdjust , View.Frame.Width-10 , GetRectForString( header_Revision.Title(UIControlState.Normal) , 18 , View.Frame.Width-10 ).Height );
źródło
CGSize stringsize = [lbl.text sizeWithAttributes: @{NSFontAttributeName:[UIFont fontWithName:FontProximaNovaRegular size:12.0]}]; CGSize adjustedSize = CGSizeMake(ceilf(stringsize.width), ceilf(stringsize.height));
użyj
ceilf
metody, aby właściwie zarządzaćźródło