2013-09-23 14 views
5

Birçok -iOS7 onaylanmaz. sizeWithFont:ConstrainedTosize:lineBreakMode için iyi ama ben sadece bir satırda benim dize neyi istiyorsanızYedek lineBreakMode: Karmaşık pdf dokümanların oluşturulması için baskılı dizeleri düzenini belirlemek için kullandığımız olmuştu yöntemlerden

boundingRectWithSize:options:attributes: 

: Belgeler kaldırılmış olan tüm sizeWithFont yöntemler için yedek olarak kullanmak üzere aynı yöntemi sesleniyor? Maksimum yükseklik için ne kullanacağımı bilmiyorum, bu yüzden ilk parametre için bir değer olarak teslim edilmemem gerekiyor. İşte

verilen bir boyuta sınırlama zaman ne var.

CGFloat maxHeightAllowable = _maxHeight; 
CGSize issueTitleMaxSize = CGSizeMake(_issueListTitleColWidth - (kColumnMargin *2), maxHeightAllowable); 
NSDictionary *issueTitleAttributes = [NSDictionary dictionaryWithObjectsAndKeys:_bodyFont, NSFontAttributeName, nil]; 
CGRect issueTitleRect = CGRectIntegral([issueTitleText boundingRectWithSize:issueTitleMaxSize options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading) attributes:issueTitleAttributes context:nil]); 
CGSize issueTitleSize = issueTitleRect.size; 
Ben maxHeight bilmiyorum ya aslında bir hat için yükseklik Bulmaya çalışıyorum tam olarak ne ben bu aynı yöntemi kullanırsınız nasıl

?

onlar NSAttributed dizeleri ve oto düzeni için uyumluluk doğru iterek ama neden bu kullanımdan kaldırmak neden anlıyorum

? Benim durumumda, şimdi, 1 veya 2 olduğu yerde 4 veya 5 adımı alır.

Bay T'nin önerdiği şekilde fontun lineHeight özelliğini kullanarak, bu yöntemleri çok basitleştiren bir kategoride yaptım. değiştirme.

#import "NSString+SizingForPDF.h" 

@implementation NSString (SizingForPDF) 

-(CGSize)integralSizeWithFont:(UIFont *)font constrainedToSize:(CGSize)maxSize 
{ 
    NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:font, NSFontAttributeName, nil]; 
    CGRect rect = CGRectIntegral([self boundingRectWithSize:maxSize options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading) attributes:attributes context:nil]); 
    return rect.size; 
} 

-(CGSize)integralSizeWithFont:(UIFont *)font maxWidth:(CGFloat)maxWidth numberOfLines:(NSInteger)lines 
{ 
    if (lines == 0) { 
     lines = 1; 
    } 
    NSDictionary *attributes = [NSDictionary dictionaryWithObject:font forKey:NSFontAttributeName]; 
    CGFloat height = font.lineHeight * lines; 
    CGSize maxsize = CGSizeMake(maxWidth, height); 
    CGRect rect = CGRectIntegral([self boundingRectWithSize:maxsize options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingTruncatesLastVisibleLine|NSStringDrawingUsesFontLeading attributes:attributes context:nil]); 
    return rect.size; 
} 

@end 

cevap

15

sadece sadece yazı tipi lineHeight özelliğini kullanamadı, bir çizginin yüksekliği aradığını ise? Bunu etiketlerimin yüksekliğini ayarlamak veya herhangi bir sorun olmadan öğelerin yüksekliğini doğru şekilde tahmin etmek için kullanırım. Bu konuda pdf belgelerinin farklı olup olmadığından emin değilim. Ayrıca, bu işlevlerin kullanımdan kaldırıldığına inanıyorum, çünkü bu NSString + UIKit işlevleri dizisi (sizeWithFont:..., vb.) Iş parçacığı güvenli olmayan UIStringDrawing kitaplığına dayanıyordu. Eğer (herhangi bir başka UIKit işlevselliği gibi) ana iş parçacığı üzerinde değil onları çalıştırmak çalıştı varsa, öngörülemeyen davranışları alırsınız. Özellikle, işlevi aynı anda birden çok ileti dizisinde çalıştırırsanız, muhtemelen uygulamanızı kilitler. iOS 6'da, onlar NSAttributedStrings için boundingRectWithSize:... yöntemi tanıtıldı nedeni budur. Bu, NSStringDrawing kitaplıklarının üzerine kurulmuş ve iş parçacığı güvenlidir.

Bu notta, yalnızca iOS 6 ve iOS 7'yi destekliyor olsaydınız, NTString'in sizeWithFont:... ürününü NSAttributeString'in boundingRectWithSize ürününe kesinlikle değiştirirdim. Garip, çok iş parçalı bir köşe kasasına sahip olursanız, sizi çok fazla baş ağrısından kurtarır! İşte dönüştürülmüş nasıl NSString en sizeWithFont:constrainedToSize::

NSString *text = ...; 
CGFloat width = ...; 
UIFont *font = ...; 
CGSize size = [text sizeWithFont:font 
       constrainedToSize:(CGSize){width, CGFLOAT_MAX}]; 

kolayca değiştirilebilir Can:

NSString *text = ...; 
CGFloat width = ...; 
UIFont *font = ...; 
NSAttributedString *attributedText = 
    [[NSAttributedString alloc] 
     initWithString:text 
     attributes:@ 
     { 
      NSFontAttributeName: font 
     }]; 
CGRect rect = [attributedText boundingRectWithSize:(CGSize){width, CGFLOAT_MAX} 
              options:NSStringDrawingUsesLineFragmentOrigin 
              context:nil]; 
CGSize size = rect.size; 

belgelerine dikkat edin bahseder: eskiden ne

iOS yılında

7 ve daha sonra, bu yöntem geri büyüklüğü bileşeninde (fraksiyonel boyutları döndürür ed CGRect); boyut görünümlerine döndürülen bir boyut kullanmak için, değerini, tavan işlevini kullanarak en yakın üst tam sayı 'a yükseltmeniz gerekir.

Yani görüşlerini boyutlandırma için kullanılacak hesaplanan yüksekliği veya genişliği çekmek için, ben kullanırsınız:

CGFloat height = ceilf(size.height); 
CGFloat width = ceilf(size.width); 
+0

Yöntemin hemen hemen benimkiyle aynı, sadece ben kelepçe CGRectIntegral makro kullanmak tamsayılar için değerler. Çizgi yüksekliği için yazıya bakmayı hiç düşünmemiştim. Benim için cevap buydu. Eski kodumu daha kolay bir şekilde değiştiren bir kategoride birkaç yeni yöntem yapmak için kullandım. –

+1

LineBreakMode, öznitelikler sözlüğüne eklenebilecek bir NSParagraphStyle özniteliğiyle değiştirilir. Bunun nasıl yapılacağına dair ayrıntılı bir örnek için http://stackoverflow.com/a/26894770/338468 adresine bakın. –

İlgili konular