2014-11-28 23 views
5

iOS 8 önce, evet, şimdi bu & ile sorun yoktu.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. 

Bu benim kodudur:

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(); 

amacım görüntüye görünümü dönüştürülmesidir. Eğer çizim şeye boş dikdörtgenler için

cevap

2

Kontrol, görünümün sınırları veya katmanın içeriği dikdörtgen olsun. IOS 8'de, daha önce boş dikdörtgenlerin sessizce göz ardı edildiği bu iddianın başarısız olduğunu fark ettim.

Ben bir dizi ekledik ...

if (!CGRectIsEmpty(bounds)) { 
} 

... benim çizimde koşulları.

+0

Merhaba Philip, Ah! TAMAM! Teşekkürler. Denedim ama çalışmadı, bu kod UIGraphicsBeginImageContextWithOptions? halinde { (CGRectIsEmpty (self.view.bounds)!) [Self.view.layer renderInContext: UIGraphicsGetCurrentContext()]; } –

+0

Tamam, ama katman ne olacak? Bir sorun ve bir sorun olabilir bir contentRect vardır. –

+0

Evet, katmanı denedim ve değil ... –

0

... Diğer yollarla ihracatını çözeceğim.

Saygılarımızla.

- (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

İşleri 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

Biz de bu sorunla karşılaştık ve bir CornerRadius CALayer ayarlanmış olan bir görünüme onu takip ama sıfır boyutu vardı. Bizim durumumuzda, bu sadece bir cihaz üzerinde gerçekleşiyordu - simülatörde değil. Eğer backtrace'inde _renderBorderInContext ve CA_CGContextAddRoundRect görüyorsanız, muhtemelen aynı şeyi görüyorsunuz.

boyutu (yükseklik/genişlik) ya bir sıfır boyutlu bir köşe yarıçapı ayarlanmışsa, bu hata oluşmasına neden olur. Ne yazık ki bir iddia olduğu için, bu hatayı yakalamak ve kurtarmak mümkün değildir, bu yüzden durum tespit etmek için snapshotting önce hiyerarşiden geçme seçeneğini keşfetmek ve renderInContext çağrısından sonra 0 ve geri köşeRadius ayarlayarak kurtarmak.

+1

Bilginin başka bir bit'i - görünüm gizlendiyse veya alfa 0'a sahipse, onaylama işlemi gerçekleşmeyecektir. Yani, sıfırıncı olmayan köşe Radius, sıfır yükseklik veya genişliğe sahip olmayan ve gizli olmayan ve gizli olmayan görünümleriniz varsa renderInContext'e dikkat edin. -fır alfa değeri. – tyler

0

çekirdek grafikleri ile kullanmadan önce isnan (x) ile şamandıra kontrol edin.

0

Yükleyiciden gelen yanıta göre sorunu çözüyorum. Sadece self.view'deki problemli görünümü öğrenebilirsiniz. Ios 8, sıfır boyutlu görünümün cornerRadius'u ayarlamasına izin vermez. Yani sıfır boyutta bir görünüme sahip olmanız ve bunun için cornerRadius'u ayarlamanız gerekir. Bunu bulmak ve düzeltmek için aşağıdaki kodu çalıştırabilirsiniz.

- (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; 
    } 
}