2011-10-08 13 views
6

Sto preparando la mia app per iPhone per pubblicare su iOS 5 GM e ho trovato un bug con UIView. Quando eseguo l'override del metodo drawRect su una sottoclasse, il simulatore mostra il risultato desiderato, ma quando provo a testare su un dispositivo reale, l'override drawRect non ha alcun effetto.iOS 5 URIdiew override drawRect non funziona sul dispositivo

Ho persino inserito un'istruzione di registrazione all'interno di un comando drawRect e confermato che viene chiamato.

Qualcun altro ha notato questo problema?

Ecco un codice di override sto usando:

- (void)drawRect:(CGRect)rect { 
DebugLog(@"*** calling drawRect ***"); 

CGContextRef context = UIGraphicsGetCurrentContext(); 

// draw the dark gray background 
CGContextSetFillColor(context, [SkinManager getWhiteColor]); 
CGContextFillRect(context, CGRectMake(0.0, 0.0, rect.size.width, rect.size.height)); 

// draw the text field background in white 
CGContextSetFillColor(context, [SkinManager getDarkGray]); 
CGContextFillRect(context, CGRectMake(2.0, 2.0, rect.size.width - 4, rect.size.height - 4)); 

}

Ecco il codice per la generazione di colore

+(const CGFloat*) getDarkGray { 
     UIColor *color = [UIColor colorWithRed:51/255.0 green:51/255.0 blue:51/255.0 alpha:1]; 

     return [self getCGColor:color]; 
} 

+(const CGFloat*) getCGColor: (UIColor*)color { 
     CGColorRef colorref = [color CGColor]; 

     const CGFloat *components = CGColorGetComponents(colorref); 

     return components; 
} 

Ancora una volta, questo codice funziona perfettamente in iOS 4.xe in the Simulator per iOS 5. L'unico posto rotto è iOS 5 Device.

+0

Inserisci il tuo codice, è più probabile che ci sia un problema lì che in iOS poiché è così semplice che altri lo avrebbero incontrato anche se c'è un bug (la nostra azienda ha diverse app iOS e non abbiamo visto eventuali problemi in quest'area). – DarkDust

+1

Inoltre, iOS 5 è ancora sotto NDA, quindi potresti voler andare al Dev-Forum. – Phlibbo

+0

Ho inserito una domanda nel forum dev ma finora nessuno ha avuto risposta. – Jay

risposta

0

Invece di utilizzare rect nel codice, provare a utilizzare self.bounds. Rect è l'area che necessita di aggiornamento, non l'intera area della tua vista.

+0

Ho provato a utilizzare self.bounds e non ha fatto alcuna differenza. – Jay

+1

Sei sicuro che drawRect sia in una sottoclasse e non in una categoria? Eseguire l'override nelle categorie non funziona sempre su tutte le versioni di iOS. – EricS

+0

Sì, è una sottoclasse. In realtà è una sottoclasse di una sottoclasse. Sono abbastanza sicuro che questo sia un bug dal momento che il simulatore funziona correttamente. – Jay

0

in iOS 5 drawRect: non è su alcuni oggetti, ad es. UINavigationBar. In questi casi, devi utilizzare i nuovi metodi di stile iOS 5 in modo condizionale.

This question e this la domanda potrebbe essere utile per voi.

+1

Non vero; dice semplicemente che non sarà chiamato a meno che tu non sia in una sottoclasse. E l'OP si riferisce a un 'UIView', non a nessuna delle viste a cui questo si applica. – FeifanZ

2

Usa [self setNeedsDisplay];

Il metodo drawRect viene chiamato solo a init, in modo che possa passare che se l'oggetto è stato Inited in precedenza ed è necessario "rinfrescare" esso.

Problemi correlati