2013-09-23 18 views
9

Sto lavorando su CAShapeLayer .E cercando di disegnare path.I non lineari vogliono set struttura a CAShapeLayer .Così posso usare CGPathGetPathBoundingBox metodo per ottenere frame da CGPathRef.Telaio e Bounds di CAShapeLayer

Ecco il codice:

CGMutablePathRef path = CGPathCreateMutable(); 
CGPathAddArc(path, NULL, rect.size.width/2, rect.size.height/2, 100, (0), (M_PI_2), NO); 
CGPathAddArc(path, NULL, rect.size.width/2, rect.size.height/2, 100-50, (M_PI_2), (0), YES); 
CGPathCloseSubpath(path); 
CAShapeLayer* arcLayer = [[CAShapeLayer alloc]init]; 
arcLayer.path = path; 
arcLayer.frame = CGPathGetPathBoundingBox(path); 
arcLayer.bounds = CGPathGetPathBoundingBox(path); 
[self.layer addSublayer:arcLayer]; ` 

Si prega di fare riferimento il mio codice con attenzione .Ho hanno fissato lo stesso telaio e limiti al problema CAShapeLayer.My è se io non pongo limiti (stesso frame), allora non mostrerò il mio contenuto o non mostrerà il mio contenuto all'interno del frame.Perché, per favore aiutatemi.

risposta

8

Quanto segue è una citazione dalla documentazione CALayer:

Il rettangolo telaio è la posizione e la dimensione del livello specificato nello spazio di coordinate del superlayer. Per i livelli, il rettangolo del riquadro è una proprietà calcolata derivata dai valori nelle proprietà bounds, anchorPoint e position. Quando assegni un nuovo valore a questa proprietà, il livello cambia la sua posizione e le proprietà dei limiti in modo che corrispondano al rettangolo specificato. I valori di ciascuna coordinata nel rettangolo sono misurati in punti.

Sembra che con l'CAShapeLayer quando si imposta la frame di per sé does't mantenere i valori di origine dal CGRect assegnato, solo la dimensione. Quando si imposta bounds, l'origine viene mantenuta e pertanto viene visualizzata nella posizione corretta. È inoltre necessario impostare il valore di posizione al punto centrale di cui si desideri modellare da visualizzare:

CGMutablePathRef path = CGPathCreateMutable(); 
CGPathAddArc(path, NULL, rect.size.width/2, rect.size.height/2, 100, (0), (M_PI_2), NO); 
CGPathAddArc(path, NULL, rect.size.width/2, rect.size.height/2, 100-50, (M_PI_2), (0), YES); 
CGPathCloseSubpath(path); 
CAShapeLayer* arcLayer = [CAShapeLayer layer]; 
arcLayer.path = path; 
CGRect pathRect = CGPathGetPathBoundingBox(path); 
arcLayer.bounds = pathRect; 
arcLayer.position = CGPointMake(CGRectGetMidX(pathRect), CGRectGetMidY(pathRect)); 
[self.layer addSublayer:arcLayer]; 
+0

Quindi, in una frase: non impostare 'frame', solo' bounds', e anche impostare 'position'? –

+3

Sì. Sebbene, pensavo che una domanda da 500 punti richiedesse una risposta un po 'più prolissa. –

+0

In generale con i livelli penso che ottieni i risultati migliori impostando _bounds_ + _position_ e non _frame_. Ma per CAShapeLayer, non penso che i limiti siano importanti, a meno che non si voglia aggiungere una traduzione ai contenuti.Tuttavia questo non spiega perché il percorso non viene disegnato, vero? – nielsbot

15

Quando si modifica il frame di un CALayer, si sta modificando la sua dimensione e la posizione nello spazio di coordinate è il suo superlayer. frame è un valore calcolato, basato sugli oggetti bounds e position. In questo caso, il livello non ha ancora un super strato in modo che il suo spazio di coordinate sia privo di dimensioni. Quando si imposta frame, la dimensione viene trasferita alla proprietà bounds, ma poiché qualsiasi punto in uno spazio senza dimensione è zero, la posizione rimarrà zero invece di ciò che si intendeva.

Per risolvere questo problema, è possibile impostare bounds per impostare le dimensioni del livello e position (che è una proprietà reale non calcolata) nello spazio di coordinate del superlayer prima di aggiungerlo come sottolivello.

0

In base alla mia esperienza, l'impostazione di position di CAShapeLayer è sufficiente per consentirne la visualizzazione dove desiderato. L'impostazione di bounds non è richiesta per questo.

Vedere il codice di esempio CoreAnimationText per utilizzarlo in questo modo.

+1

Dipende da cosa stai facendo in seguito con il livello. Se provi a trasformarlo con "limiti" vuoti, i risultati potrebbero essere esilaranti. –

+0

Interessante. Ho eseguito molte trasformazioni di oggetti 'CAShapeLayer' raggruppati come sottolivelli di un altro' CALayer'. Fortunatamente, non ho mai avuto problemi. Lo terrò a mente, se l'ilarità dovesse scaturire. – JanX2

0

È necessario impostare bounds oppure si comporterà come lo anchorPoint è impostato su [0, 0]. Chi lo vuole? : D