2014-12-03 6 views
5

Ich verwende NSAttributedString, um Bilder in eine Zeichenfolge aufzunehmen. Die Bilder sind jedoch manchmal verschwommen, wenn sie auf einen nicht ganzzahligen Rahmen gezeichnet werden.Verschwommenes Bild (NSTextAttachment) auf NSAttributedString

Ich habe versucht, um sicherzustellen, dass die Grenze jeder NSTextAttachment von ganzzahliger Größe ist, aber das scheint nicht zu helfen. Irgendwelche Tipps, um sicherzustellen, dass es nicht verschwommen ist?

Siehe beigefügten Screenshot, der erste Bus ist nicht verschwommen, aber der zweite ist.

enter image description here

+0

Wie rendern Sie die attributierte Zeichenfolge? ('UILabel',' CATextLayer', andere) –

+0

Es ist auf einem UILabel – gcamp

+0

Ich versuche es mit CATextLayer – gcamp

Antwort

1

Ich reparierte diese durch eine Kategorie NSAttributedString hinzufügen.

Grundsätzlich müssen Sie den NSTextAttachment-Rahmen erhalten und den fehlenden Bruchteil seiner X-Koordinate hinzufügen, damit er schön abgerundet wird.

- (void)applyBlurrinessFixToAttachments { 
    [self enumerateAttribute:NSAttachmentAttributeName inRange:NSMakeRange(0, self.length) options:0 usingBlock:^(id value, NSRange range, BOOL *stop) { 
     if (![value isKindOfClass:[NSTextAttachment class]]) { 
      return; 
     } 
     NSTextAttachment *attachment = (NSTextAttachment*)value; 
     CGRect bounds = attachment.bounds; 
     CGRect attributedStringRect = [self boundingRectForCharacterRange:range]; 

     double integral; 
     double fractional = modf(attributedStringRect.origin.x, &integral); 
     if (fractional > 0) { 
      double roundedXOrigin = 1.0 - fractional; 

      // If X coordinate starts at 0.7, add 0.3 to it 
      bounds.origin.x += roundedXOrigin; 
      attachment.bounds = bounds; 
     } 
    }]; 
} 

- (CGRect)boundingRectForCharacterRange:(NSRange)range { 
    NSTextStorage *textStorage = [[NSTextStorage alloc] initWithAttributedString:self]; 
    NSLayoutManager *layoutManager = [[NSLayoutManager alloc] init]; 
    [textStorage addLayoutManager:layoutManager]; 
    NSTextContainer *textContainer = [[NSTextContainer alloc] initWithSize:CGSizeMake(CGFLOAT_MAX, CGFLOAT_MAX)]; 
textContainer.lineFragmentPadding = 0; 
    [layoutManager addTextContainer:textContainer]; 

    NSRange glyphRange; 
    [layoutManager characterRangeForGlyphRange:range actualGlyphRange:&glyphRange]; 

    return [layoutManager boundingRectForGlyphRange:glyphRange inTextContainer:textContainer]; 
} 
0

Sie folgenden Code für die Bild runde

UIGraphicsBeginImageContextWithOptions verwenden (CGSizeMake (14, 14), NO, [UIScreen mainscreen] .scale);

-(UIImage *)makeRoundedImage:(UIImage *) image radius: (float) radius { 
CALayer *imageLayer = [CALayer layer]; 
imageLayer.frame = CGRectMake(0, 0, 14, 14); 
imageLayer.contents = (id) image.CGImage; 

imageLayer.masksToBounds = YES; 
imageLayer.cornerRadius = radius; 

UIGraphicsBeginImageContextWithOptions(CGSizeMake(14, 14), NO, [UIScreen mainScreen].scale); 
[imageLayer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage *roundedImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

return roundedImage; 
} 
+1

Können Sie erklären, warum und wie der Code funktioniert? –

+0

für die Bildgrößenanpassung muss zuerst die zu skalierende Zielgröße bestimmt werden – amitg3