2012-09-23 13 views
17

Ho pensato che da un certo punto di OS X, e sempre vero per iOS, quel contenuto può apparire al di fuori dei limiti della vista? (Per UIView) Ma se creo una nuova Visualizzazione singola applicazione, e creato una classe MyView che le sottoclassi UIView, e attuare le sue drawRect:Su iOS, drawRect non può disegnare al di fuori dei limiti della vista?

- (void)drawRect:(CGRect)rect 
{ 
    // Drawing code 
    UIBezierPath *path = [UIBezierPath bezierPathWithRect: 
              CGRectMake(-20, -20, 600, 600)]; 
    [[UIColor greenColor] set]; 
    [path fill]; 

    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextSetFillColorWithColor(context, [[UIColor blueColor] CGColor]); 
    CGContextFillRect(context, CGRectMake(-20, -20, 600, 600)); 
} 

Io uso sia UI e CG per disegnare un rettangolo ciascuna, proprio in caso uno lavora e l'altro no. E la vista viene aggiunto in viewDidAppear:

- (void)viewDidAppear:(BOOL)animated { 
    MyView *myView = [[MyView alloc] initWithFrame:CGRectMake(20, 20, 260, 260)]; 
    [self.view addSubview:myView]; 
} 

Ma non importa cosa, la casella colorata non andrà oltre la regione (20, 20, 260, 260). È vero che solo i CALayer possono essere liberamente aggiunti e visualizzati al di fuori dei limiti di una vista? Può essere perché il contesto grafico è limitato a questo (20, 20, 260, 260) per cominciare? In tal caso, c'è un modo per rendere il contenuto di drawRect visualizzato al di fuori del limite della vista, in tutte e quattro le direzioni in alto, in basso, a sinistra, a destra?

+0

Posso chiederlo, perché vuoi disegnare all'esterno del rettangolo visibile, poiché non sarà visibile? Se hai intenzione di renderlo visibile in seguito, dovresti usare un CALayer come hai menzionato correttamente. – Lefteris

+0

un motivo è, sto pensando di implementare un PopoutScrollView che ha angoli arrotondati, o anche "nuvola come bordi". Ho scoperto che posso creare sottoclassi UIView e avere un UIScrollView come proprietà, in modo che la scrollview sia una sottoview della vista, e in realtà devo sovrascrivere 'addSubview' per aggiungere a' self.scrollView'. Questo perché non posso semplicemente disegnare i bordi su una scrollView, altrimenti scorrono. Questo può essere complicato, e ho pensato, perché non solo sottoclassi UIScrollView, e in drawRect, disegnare al di fuori dei limiti? Quindi non devo sovrascrivere tanti metodi. –

+0

Anche se non ho provato questo, ma non vedo un motivo per questo non funziona, aggiungendo angoli arrotondati alla scrollview, attraverso la proprietà scrollview.layer.cornerRadius dovrebbe farlo per voi. Inoltre, se hai intenzione di modificare una scrollView, dovresti creare una sottoclasse della scrollview e il suo metodo drawRect, piuttosto che una UIView – Lefteris

risposta

0

Prova questo su una vista, in cui è stato aggiunto lo ScrollView:

self.scrollView.backgroundColor = [UIColor darkGrayColor]; 
self.scrollView.layer.cornerRadius = 10.0f; 
self.scrollView.layer.masksToBounds = YES; 

Si dovrebbe mostrare una ScrollView grigio con gli angoli arrotondati, come si desidera.

Ricorda è necessario importare il QuartzCore FrameWork

+0

e se dovesse uscire dai limiti? –

+0

Non capisco la domanda – Lefteris

+0

Voglio dire, il codice sopra disegnerà lo sfondo tutto all'interno dei limiti della vista. Che cosa succede se dobbiamo disegnare qualcosa di 10 pixel sopra la parte superiore, 10 pixel a sinistra del margine sinistro, ecc. (Disegnare qualcosa, o in questo caso disegnare lo sfondo e gli angoli arrotondati) –

20

tuo problema è che "drawRect" è ritagliato automaticamente alla vista che si sta disegnando in.

Invece di fare il disegno nella vista stessa , aggiungi una seconda vista (secondaria) alla prima vista, che è al di fuori dei limiti della prima vista. Ciò ti consentirà di fare il disegno che dipende dal posizionamento della prima vista, ma è al di fuori dei limiti della prima vista.

Spero che questo aiuti.

Problemi correlati