2014-11-28 8 views
5

Prima di iOS 8, non ho avuto problemi con questo & ora, sì.iOS 8 Crash - renderInContext: UIGraphicsGetCurrentContext()

LOG:

Assertion failed: (CGFloatIsValid(x) && CGFloatIsValid(y)), function void CGPathMoveToPoint(CGMutablePathRef, const CGAffineTransform *, CGFloat, CGFloat), file Paths/CGPath.cc, line 254. 

Questo è il mio codice:

UIImage* image = nil; 

CGSize imageSize = CGSizeMake(self.view.bounds.size.width, self.view.bounds.size.height); 

UIGraphicsBeginImageContextWithOptions(imageSize, NO , 0.0f); 

[self.view.layer renderInContext:UIGraphicsGetCurrentContext()]; // <- ERROR 

image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

Il mio scopo è quello di convertire la vista dell'immagine.

risposta

2

Controlla rettangoli vuoti in quello che stai disegnando, se i limiti della vista o il rettangolo del contenuto del livello. Ho notato che l'asserzione non funziona su iOS 8 dove, prima, i rettangoli vuoti venivano silenziosamente ignorati.

Ho aggiunto un certo numero di ...

if (!CGRectIsEmpty(bounds)) { 
} 

... condizioni nel mio disegno.

+0

Ciao Philip, Oh! OK! grazie. Provo ma non ha funzionato, questo codice è dopo UIGraphicsBeginImageContextWithOptions? if (! CGRectIsEmpty (self.view.bounds)) { [self.view.layer renderInContext: UIGraphicsGetCurrentContext()]; } –

+0

OK, ma per quanto riguarda il livello? Ha un limite e un contenuto che potrebbe essere un problema. –

+0

Sì, ho provato sul livello, e non ... –

0

Mentre ... risolverò l'esportazione in altro modo.

Saluti.

- (IBAction)ibaExportar:(id)sender { 

    NSString *mystr = @""; 

    NSString *csvstr; 

    csvstr = [NSString stringWithFormat:@",Cliente,Domicilio,Dueño"]; 

    mystr = [NSString stringWithFormat:@"%@,%@,%@\n",self.numCliente,self.iboDomicilio.text,self.iboDueno.text]; 


    csvstr = [NSString stringWithFormat:@"%@\n%@",csvstr,mystr]; 

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 

    NSString *docDir = [paths objectAtIndex:0]; 

    fileName = [docDir stringByAppendingPathComponent:[NSString stringWithFormat:@"Reporte.csv"]]; 

    NSError *error = NULL; 

    BOOL written = [csvstr writeToFile:fileName atomically:YES encoding:NSUTF8StringEncoding error:&error]; 


    if (!written) 

     NSLog(@"write failed, error=%@", error); 

    else{ 

     [self sendEmail]; 

    } 
} 


- (void) sendEmail { 

     NSString*subject; 

     subject= [@"Reporte Cliente " stringByAppendingString:@""]; 

     MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init]; 

     picker.mailComposeDelegate = self; 

     [picker setSubject:subject]; 

     NSData *dataFile = [NSData dataWithContentsOfFile:fileName]; 

     [picker addAttachmentData:dataFile mimeType:@"text/csv" fileName:@"Reporte.csv"]; 

     NSString *emailBody =subject; 

     [picker setMessageBody:emailBody isHTML:NO]; 

     [self presentViewController:picker animated:YES completion:nil]; 


} 

-(void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error { 

    [self dismissViewControllerAnimated:YES completion:nil]; 
} 
0

Opere in IOS 8

UIGraphicsBeginImageContext(self.view.bounds.size); 
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()]; 

UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 

UIGraphicsEndImageContext(); 

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *docDir = [paths objectAtIndex:0]; 

fileName = [docDir stringByAppendingPathComponent:[NSString stringWithFormat:@"reporte.png"]]; 


NSData *imageData = UIImageJPEGRepresentation(image, 1.0); 
NSError *error = NULL; 
BOOL written =[imageData writeToFile:fileName atomically:YES]; 


if (!written) 
    NSLog(@"write failed, error=%@", error); 
else{ 
    [self sendPorCorreo]; 
} 
1

ci siamo imbattuti in questo problema come bene e rintracciato verso il basso per una visione che ha avuto un cornerRadius impostato sul CALayer, ma aveva una dimensione pari a zero. Nel nostro caso, questo si verificava solo su un dispositivo, non sul simulatore. Se vedi _renderBorderInContext e CA_CGContextAddRoundRect nel tuo backtrace, probabilmente stai vedendo la stessa cosa.

Una dimensione zero in entrambe le dimensioni (altezza/larghezza) causerà questo errore se è impostato un raggio dell'angolo. Sfortunatamente, poiché è un'affermazione, non è possibile rilevare l'errore e recuperare, quindi stiamo esplorando l'opzione di attraversare la gerarchia prima di eseguire lo snapshotting per rilevare il caso e ripristinare impostando il valore CornerRadius su 0 e ritorno dopo la chiamata a renderInContext.

+1

Un altro bit di informazioni - l'asserzione non scatterà se la vista è nascosta o ha alpha 0. Quindi, attenzione per renderInContext se hai viste che hanno angoloRadius diverso da zero, altezza o larghezza zero e non sono nascosti e hanno un non -zero valore alfa. – tyler

0

Controlla il tuo float con isnan (x) prima di utilizzarlo con Core Graphics.

0

Secondo la risposta di Tyler, ho risolto il problema. Puoi solo scoprire la visione problematica in self.view. L'ios 8 non consente la visualizzazione della dimensione zero per impostare il cornerRadius. Quindi è necessario avere una vista a dimensione zero e impostare l'angoloRadius per questo. È possibile eseguire il seguente codice per scoprirlo e risolverlo.

- (void)findZeroSizeControlWithSuperView:(UIView *)superView { 
    [self isProblematicCrotrol:superView]; 
    [superView.subviews enumerateObjectsUsingBlock:^(__kindof UIView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { 
     [self isProblematicCrotrol:obj]; 
    }]; 
} 
- (BOOL)isProblematicCrotrol:(UIView *)view { 
    if ((view.frame.size.width == 0 || view.frame.size.height == 0) && view.layer.cornerRadius != 0) { 
     NSLog(@"this is the problematic view:%@", view); 
     return YES; 
    } else { 
     return NO; 
    } 
}