Swift mapview не может отображать уменьшенное изображение - PullRequest
2 голосов
/ 27 марта 2020

Я записываю изображение в файл и читаю обратно в методе mapView didSelect, и он выдает ошибку чтения данных изображения.

 var localImageFileUrl: URL? = nil

            do {
                delegate.documentDirectoryUrl = try FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)

                if let data = aStruct.imageData  {
                    localImageFileUrl =  delegate.documentDirectoryUrl!.appendingPathComponent("Image.png")
                    UserDefaults.standard.set(localImageFileUrl, forKey: "localImageFileUrl")
                    try data.write(to: localImageFileUrl!)
                }

            }
            catch {
                print("error")
            }

Проверьте, что все работает нормально.

          do{
                 print("imageUrl0: \(localImageFileUrl)")
                let imageData: Data = try Data(contentsOf: localImageFileUrl as! URL)
                let image = UIImage(data: imageData)
               print(image)
            }catch{
                print("Unable to load image data: \(error)")
            }

debug вывод окна:

imageUrl0: необязательно (файл: ///var/mobile/Containers/Data/Application/19A5A226-3CAF-4DC0-9015-40278703C5BA/Documents/Image.png)

Необязательно (, {120, 120}) работает нормально.

Я передаю данные через структуру, подобную этой:

   let endPtPin = GpsData.MyEndPt(latitude:  Double(latitudeStr) as! Double, longitude: Double(longitudeStr) as! Double, url: localImageFileUrl! as NSURL)

Внутри mapView метода didSelect, я извлекаю URL и попробуйте получить доступ к изображению, но оно выдает ошибку:

 func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) {

     DispatchQueue.main.async {
        if let thumbnailImageButton = view.leftCalloutAccessoryView as? UIButton,
        let url = (view.annotation as? GpsData.MyEndPt)?.thumbnailUrl
         {
            print("imageUrl: \(url)")
            do{
                let imageData: Data = try Data(contentsOf: url as URL)
                let image = UIImage(data: imageData)
                    thumbnailImageButton.setImage(image, for: UIControlState.normal)

            }catch{
                print("Unable to load image data: \(error)")
            }
        }
    }
}

Окно отладки выдает ошибку:

imageUrl: Необязательно (файл: /// var / mobile / Containers /Data/Application/19A5A226-3CAF-4DC0-9015-40278703C5BA/Documents/Image.png) 2020-03-27 00: 07: 04.079576-0500 r2nr [9945: 4518812] Соединение NSURLC завершено с ошибкой - код -1002

2020-03-27 00: 07: 07.009134-0500 r2nr [9945: 4518751] Сбой CFURLCopyResourcePropertyForKey, так как ему был передан URL-адрес без cheme

Невозможно загрузить данные изображения: Ошибка Domain = NSCocoaErrorDomain Code = 256 «Файл« Image.png) »не может быть открыт». UserInfo = {NSURL = Необязательно (файл: ///var/mobile/Containers/Data/Application/19A5A226-3CAF-4DC0-9015-40278703C5BA/Documents/Image.png)}

путь к файлу не изменился, но не может прочитать данные изображения из файла. Что не так?

1 Ответ

2 голосов
/ 31 марта 2020

Я потратил пару часов и нашел способ сработать. Я получал доступ к данным изображения как Данные

if let data = aStruct.imageData  {
      localImageFileUrl =  delegate.documentDirectoryUrl!.appendingPathComponent("Image.png")
      UserDefaults.standard.set(localImageFileUrl, forKey: "localImageFileUrl")
      try data.write(to: localImageFileUrl!)
 }

Я преобразовал данные в формат PNG, как это, и он работал нормально:

  do {
        delegate.documentDirectoryUrl = try FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
       let image = UIImage(data: aContactStruct.imageData!)

       if let data = UIImagePNGRepresentation(image!){{
             localImageFileUrl =  delegate.documentDirectoryUrl!.appendingPathComponent("Image.png")
              UserDefaults.standard.set(localImageFileUrl, forKey: "localImageFileUrl")
              try data.write(to: localImageFileUrl!)
       }

   }
   catch {
            print("error")
   }
...