Domanda

Ho un UIView personalizzato che viene disegnato utilizzando il suo metodo -[drawRect:].

Il problema è che l'anti-aliasing agisce molto strano come linee nere linee orizzontali o verticali sono disegnati molto sfocata.

Se rendo invalido anti-aliasing con CGContextSetAllowsAntialiasing, tutto è disegnato come previsto.

Anti-Aliasing:
alt text http://dustlab.com/stuff/antialias.png

No Anti-Aliasing (che si presenta come il risultato atteso con AA):
alt text http://dustlab.com/stuff/no_antialias.png

La larghezza della linea è esattamente 1, e tutte le coordinate sono valori interi.

Lo stesso accade se posso disegnare un rettangolo utilizzando CGContextStrokeRect, ma non se disegno esattamente lo stesso con CGRect UIRectStroke.

È stato utile?

Soluzione

Da un ictus espande quantità uguali su entrambi i lati, una linea di una larghezza pixel non deve essere collocati su un numero intero di coordinate, ma sfalsati a 0.5 pixel.

calcolare le coordinate corrette per linee tratteggiate in questo modo:

CGPoint pos = CGPointMake(floorf(pos.x) + 0.5f, floorf(pos.y) + 0.5f);

A proposito: Non gettare i tuoi valori a int e di nuovo a galleggiare per sbarazzarsi della parte decimale. C'è una funzione per questo in C chiamata floor.

Altri suggerimenti

nelle cornici vista, probabilmente avete valori float che non sono numeri interi. Mentre i telai sono sufficientemente precisi per fare le frazioni di un pixel (float), si ottiene una macchia sfocata a meno che non si esegue il cast a un int

CGRect frame = CGRectMake((int)self.frame.bounds..., (int)...., (int)...., (int)....);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top