2017-10-09 5 views
1

J'ai une application qui affiche les endroits où l'utilisateur a marché sur un MKMapView. Lorsque l'utilisateur quitte l'affichage de la carte, l'application saisit l'écran et enregistre l'image sur le disque. Jusqu'à cette année, cette méthode a toujours été couronnée de succès. Avec iOS 11.0, la capture d'écran est une image vide. Je ne reçois aucune notification de xcode indiquant qu'il y a eu des changements et que j'ai besoin d'ajuster le code. Il est intéressant de noter que les captures d'écran à partir de pages de texte sont encore saisies et enregistrées avec succès.iOS 11 ne capture pas l'écran de MKMapView

Est-ce que quelqu'un a rencontré le même problème et a obtenu la solution?

Le code qui a toujours réussi jusqu'à jusqu'à maintenant, est:

override func viewWillDisappear(_ animated: Bool) { 

    //Set the full file name under which the track will be saved. 
    let fileBaseName = self.imageName.appending(String(describing: (self.display?.trackDate)!)) 
    let fileFullName = fileBaseName.appending(".png") 

    //Check if the image already has been saved 
    if !AuxiliaryObjects.shared.getImageFileName(with: fileFullName) { 

     //Create the sizes of the capture 
     let screenRect = self.trackMapView.frame 
     let screenSize = screenRect.size 
     let screenScale = UIScreen.main.scale 
     var grabRect = self.trackMapView.convertRegion(self.mapRegion, toRectTo: self.view) 
     var heightAdjustment : CGFloat = 0.0 

     //Grab the image from the screen 
     UIGraphicsBeginImageContextWithOptions(screenSize, false, screenScale) 
     self.trackMapView.drawHierarchy(in: screenRect, afterScreenUpdates: true) 
     let myImage = UIGraphicsGetImageFromCurrentImageContext() 

     grabRect.origin.x *= (myImage?.scale)! 
     grabRect.origin.y *= (myImage?.scale)! 
     grabRect.size.width *= (myImage?.scale)! 
     grabRect.size.height *= (myImage?.scale)! 
     let grabImage = (myImage?.cgImage)!.cropping(to: grabRect) 
     let mapImage = UIImage(cgImage: grabImage!) 

     UIGraphicsEndImageContext() 

     AuxiliaryObjects.shared.save(image: mapImage, with: fileFullName, and: self.imageName) 
     self.display?.displayImage = AuxiliaryObjects.shared.getImage(with: fileFullName, with: self.tableImageRect)! 
    } else { 
     self.display?.displayImage = AuxiliaryObjects.shared.getImage(with: fileFullName, with: self.tableImageRect)! 
    } 
} 

Répondre

1

J'ai présenté une demande de soutien au niveau de code à Apple pour obtenir la réponse à la question. Apple ne supporte pas l'utilisation de drawHierarhy pour saisir un écran MapKit. Le chemin à parcourir est d'utiliser l'utilitaire MKMapSnapshotter pour créer un MKMapSnapshot, puis dessiner dans les lignes et les annotations en convertissant toutes les coordonnées de la carte pour afficher les coordonnées. Étant donné que cela m'a causé quelques problèmes avec l'obtention d'une image miroir et la traduction correcte des coordonnées, j'ai décidé d'utiliser la méthode de calque render (dans: CGContext), ce qui m'a procuré une capture d'écran très efficace.

func creatSnapshot(with fileName: String) { 

    UIGraphicsBeginImageContextWithOptions(self.trackMapView.frame.size, false, UIScreen.main.scale) 
    let currentContext = UIGraphicsGetCurrentContext() 
    self.trackMapView.layer.render(in: currentContext!) 

    let contextImage = (UIGraphicsGetImageFromCurrentImageContext())! 
    UIGraphicsEndImageContext() 

    let region = self.trackMapView.region 
    var cropRect = self.trackMapView.convertRegion(region, toRectTo: self.trackMapView.superview) 

    cropRect.origin.x *= contextImage.scale 
    cropRect.origin.y *= contextImage.scale 
    cropRect.size.height *= contextImage.scale 
    cropRect.size.width *= contextImage.scale 

    let cgMapImage = contextImage.cgImage?.cropping(to: cropRect) 
    let mapImage = UIImage(cgImage: cgMapImage!) 

    AuxiliaryObjects.shared.save(image: mapImage, with: fileName, and: self.imageName) 
    self.displayTrack?.displayImage = AuxiliaryObjects.shared.getImage(with: fileName, with: self.tableImageRect)! 
    NotificationCenter.default.post(name: self.imageSavedNotification, object: self) 
}