Problème d'échelle iOS8 lors de l'appel de drawViewHierarchyInRect afterScreenUpdates: YES

Je convertissais un projet de iOS7 à iOS8 qui utilise des transitions personnalisées et doit capturer le modal après avoir terminé le chargement afterScreenUpdates:YES et voyait que l'écran entier se resize pour une seconde et redescendre. Je vois aussi cela se produire dans l'application Flickr pour iOS entre les sections et sur l'application Yelp lors de la transition vers une photo sur iOS8.

  UIGraphicsBeginImageContextWithOptions(self.view.frame.size, YES, 22.0); [self.view drawViewHierarchyInRect:self.view.frame afterScreenUpdates:YES]; UIGraphicsEndImageContext(); 

L'ajout d'un facteur d'échelle plus important aide à accentuer le pépin plus … mais je n'appelle cela que sur un button dans l'exemple.

EDIT Cela semble se produire sur iPhone 6 et 6 plus sur le 5.

paille d'échelle

Exemple de projet github

Avez-vous besoin de dessiner après les mises à jour de l'écran? parce que j'utilise:

 [view drawViewHierarchyInRect:view.bounds afterScreenUpdates:NO]; 

et il semble bien fonctionner sur iOS7 et iOS8. J'imagine que ce n'est pas une excellente solution pour capturer des images régulièrement (comme plusieurs fois par seconde), mais il semble fonctionner pour un flou une fois.

Vous devez fournir @ 3x images de lancement pour les 6 et 6 plus. Le 6 étant mis à l'échelle à 750×1334, et l'image 6 plus étant mise à l'échelle à 1242×2208.

Même si cela ressemble à un bug dans l'API, vous pouvez appeler drawViewHierarchyInRect avec afterScreenUpdates défini sur NO pour build un snapshot AFTER mises à jour de l'écran si vous utilisez cunstruction comme ceci:

 typedef void (^CompletionHandlerWithId)(id result); -(void)imageContaining:(CGRect)rect afterScreenUpdates:(bool)afterScreenUpdates opaque:(BOOL)opaque completion:(CompletionHandlerWithId)completion { bool success __block; UIImage *snapshotImage __block = nil; CompletionHandler block = ^{ // Create the image UIGraphicsBeginImageContextWithOptions(self.bounds.size, opaque, [[UIScreen mainScreen] scale]); success = [self drawViewHierarchyInRect:self.bounds afterScreenUpdates:NO]; if (success) { snapshotImage = UIGraphicsGetImageFromCurrentImageContext(); CGImageRef imageRef = CGImageCreateWithImageInRect( [snapshotImage CGImage], CGRectMake( snapshotImage.scale*rect.origin.x, snapshotImage.scale*rect.origin.y, snapshotImage.scale*rect.size.width, snapshotImage.scale*rect.size.height)); // or use the UIImage wherever you like snapshotImage = [UIImage imageWithCGImage:imageRef scale:snapshotImage.scale orientation:UIImageOrientationUp]; CGImageRelease(imageRef); } UIGraphicsEndImageContext(); if (completion) { if (! success) { NSLog(@"Error: [UIView drawViewHierarchyInRect] failed on %@", self); (completion)(nil); } else { NSLog(@"Success: [UIView drawViewHierarchyInRect] on %@", self); (completion)(snapshotImage); } } }; if (afterScreenUpdates) [CATransaction setCompletionBlock:^{ (block)(); }]; else (block)(); } 

Ce bug existe également lorsque vous utilisez un iPad2 sous iOS7.

Corriger: set afterScreenUpdates: à NO

Mon application a des UIButtons en mouvement, donc je n'autorise pas la transition de flou tant que le mouvement n'est pas arrêté. Pour autant que j'ai trouvé jusqu'ici, il n'y a aucune différence dans OUI ou NON.

Apparaît pour être corrigé dans iOS9 / XCODE 7 builds

J'ai trouvé une solution pour résoudre ce problème.

J'ajoute @ 3x lancer des images à mon projet. Et choisissez lancer le file d'écran à "principal". Cela permettra à l'application de fonctionner à la résolution d'origine, avec des limites plus petites quand elle est exécutée sur iphone6, mais sans problème lors de l'appel de drawViewHierarchyInRect. Comme ça.

Puis, mon échelle d'affichage en plein écran lorsque viewDidLoad.

 - (void)viewDidLoad{ [super viewDidLoad]; UIScreen *mainScreen = [UIScreen mainScreen]; CGRect tempFrame=mainScreen.bounds; double aspect=tempFrame.size.width/320; self.view.transform = CGAffineTransformScale(CGAffineTransformIdentity, aspect, aspect); } 

J'espère utile 🙂