Sto provando a smussare i percorsi nella grafica di base. Qualcuno lo ha già fatto per forme arbitrarie e, in caso affermativo, sono disposti a condividere il codice?Smussare un tracciato/forma in Core Graphics
Ho incluso la mia implementazione di seguito. Io uso tre variabili per determinare lo smusso: CGFloat bevelSize
, UIColor highlightColor
, UIColor shadow
. Si noti che l'angolo della fonte di luce è sempre di 135 gradi. Non ho ancora finito di implementare questo, ma qui è essenzialmente quello che sto cercando di fare, diviso in due parti. Prima parte, genera punti focali:
- Trovo le bisettrici per gli angoli tra le linee adiacenti nel percorso.
- Per gli archi, la bisettrice è la linea perpendicolare alla linea creata dai due punti finali dell'arco, originata dal punto centrale. Questo dovrebbe occuparsi della maggior parte delle situazioni in cui viene utilizzato un arco. Non prendo la bisettrice di un arco e una linea. La bisettrice dovrebbe funzionare bene in questi casi.
- Quindi calcolo i punti focali in base all'intersezione di ciascuna bisettrice adiacente.
- Se un punto focale è all'interno della forma utilizzata, altrimenti viene scartato.
Lo scopo di generare i punti focali è "ridurre" la forma in modo proporzionale.
La seconda parte è un po 'più complicata. È essenziale creare ciascun lato/segmento della forma smussata. Lo faccio disegnando 'in' (dallo bevelSize
) ogni punto della forma originale lungo il raggio della linea che si estende dal punto focale più vicino al punto in questione. Quando ho due "bevelPoints" consecutivi, creo un UIBezierPath che si estende dai punti smussati ai punti originali e torna ai punti smussati (nota, questo include gli archi). Questo crea un "lato/segmento" che posso usare per riempire. Sui lati dritti, semplicemente riempio con l'ombra o il colore di evidenziazione, a seconda dell'angolo del lato. Per gli archi, determino l'arco "radiante". Se quell'arco contiene un angolo di transizione (M_PI_4 o M_PI + M_PI_4) lo riempio con una sfumatura (dall'ombra all'evidenziazione o evidenzia l'ombra, che è sempre appropriata). Altrimenti lo riempio con un colore solido.
Aggiornamento
ho diviso la mia risposta (vedi sotto) in un post sul blog a parte. Non sto più utilizzando i dettagli di implementazione che vedi sopra, ma sto mantenendo tutto lì per riferimento. Spero che questo aiuti chiunque stia cercando di usare Core Graphics.
La domanda è lunga e include molti dettagli. Puoi semplificarlo a tutti? –
Sort of. La prima parte della domanda è la domanda principale: qualcuno sa come smussare una forma arbitraria in core-graphics? Il resto sta solo descrivendo come ho implementato lo smussamento (che ho finito ora). Funziona bene su alcune forme (ma non tutte). Sto lasciando la domanda aperta nel caso qualcuno abbia un metodo. –
Ho pensato di pubblicare la mia soluzione, ma sono solo circa 400 righe di codice ... sembra molto da pubblicare. –