Strano anti-aliasing in vista personalizzata
-
12-09-2019 - |
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
.
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)....);