2014-12-17 20 views
6

Jestem nowy w Core Graphics i staram się rysować koła. Mogą być przezroczyste (tylko obrys) i wypełnione kolorem obrysu. Tak więc metoda wygląda następująco:Podstawowe obrazy graficzne niskiej jakości

+ (UIImage *)iconImageWithColor: (UIColor *)markColor strokeOnly:(BOOL)strokeOnly 
{ 
    CGRect rect = CGRectMake(0.0f, 0.0f, 20.0f, 20.0f); 

    UIGraphicsBeginImageContext(rect.size); 
    CGContextRef context = UIGraphicsGetCurrentContext(); 

    CGPathRef clippingPath = [UIBezierPath bezierPathWithRoundedRect:rect cornerRadius:7.5f].CGPath; 
    CGContextAddPath(context, clippingPath); 
    CGContextClip(context); 

    CGContextSetFillColorWithColor(context, strokeOnly == YES ? [[UIColor clearColor] CGColor] : [markColor CGColor]); 
    CGContextFillRect(context, rect); 

    CGPathRef path = CGPathCreateWithRoundedRect(rect, 10.f, 10.f, NULL); 
    [markColor setStroke]; 
    CGContextAddPath(context, path); 
    CGContextDrawPath(context, kCGPathFillStroke); 

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    return image; 
} 

Wynik jest dziwny - wygląda na to, że rozdzielczość obrazu jest bardzo niska. Czy jest możliwe, aby obraz wynikowy wyglądał dobrze na wyświetlaczu Retina?

strange image

+1

Dodaj tę linię przed rysowaniem rect: CGContextSetLineWidth (context, 1.0); Możesz zaktualizować 1.0 do swoich wymagań. Jego szerokość linii wyciągania. – Mrunal

Odpowiedz

9

UIGraphicsBeginImageContext tworzy kontekst ze skali od 1, więc nie siatkówki. Co chcesz użyć jest

UIGraphicsBeginImageContextWithOptions(rect.size, NO, 0.0f)

skala 0 oznacza, że ​​będzie używać wagi ekranu urządzenia

+0

Niewiarygodne, jesteś jabłkiem mojego oka <3 –

4

Używaj UIGraphicsBeginImageContextWithOptions(rect.size, YES, 0.0);

Ostatni parametr wynikowy oznacza gęstość pikseli (skala). Kiedy miniesz 0, odbiera go automatycznie z natywnej skali ekranu urządzenia.

Powiązane problemy