簡體   English   中英

iOS 13.2 MKTileOverlay 偶爾不會渲染

[英]iOS 13.2 MKTileOverlay occasionally won't render

我遇到了一個問題,在 iOS 13.2(可能也來自 iOS 13)中,使用MKTileOverlay加載離線地圖圖塊有時無法渲染,將圖塊留空, MKTileOverlay的子類似乎沒有問題所有這些都在 iOS 12 及更低版本中運行良好。 我有 2 個MKTileOverlay類(1 個添加網格和 1 個加載地圖圖塊文件,默認MKTileOverlay ),兩者都無法使用默認MKTileOverlayRenderer加載到那個空白圖塊上,其他疊加似乎很好。

如果我轉到主屏幕並返回應用程序,導致磁貼重新加載,問題似乎會自行解決。 這是 iOS MapKit 本身的錯誤嗎? 有沒有人對此有臨時解決方案? 謝謝你。

添加疊加層的代碼:

let overlay = MKTileOverlay(urlTemplate: urlTemplate)
overlay.canReplaceMapContent = true
overlay.maximumZ = 19
mapView.insertOverlay(overlay, at: 0, level: .aboveLabels)

渲染器:

func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
    if overlay is MKTileOverlay {
        let renderer = MKTileOverlayRenderer(tileOverlay: overlay as! MKTileOverlay)
        return renderer
    }

    return MKOverlayRenderer()
}

在此處輸入圖片說明

正如我在對原始問題的評論中指出的那樣,我遇到了同樣的問題,但現在基本上已經解決了,所以我想我會發布對我有用的內容。

我的問題發生在以下方法中

- (void)loadTileAtPath:(MKTileOverlayPath)path result:(void (^)(NSData * __nullable tileData, NSError * __nullable error))result{

自定義磁貼即使在顯示有效 NSData 的情況下也無法加載。

我發現如果我使用 jpegs 而不是 pngs 作為我的自定義磁貼,問題就會減少,但只有當我改變處理磁貼數據的方式時,問題才會在很大程度上消失。 (我主要是因為我仍然偶爾會得到卸載的瓷磚,但我會說它比我以前得到它們的頻率低 100 倍)。

以下方法是我的 Xamarin.iOS 實現,但您應該能夠看到 Swift 或 Objective C 的原理。

關鍵是 NSData 的創建方式不同。 我沒有調用 UrlForTilePath 方法,而是從平鋪路徑創建一個 UIImage,然后使用 UIImageJPEGRepresentation(C# 中的 AsJPEG)來創建 NSData。

   public override void LoadTileAtPath(MKTileOverlayPath path, MKTileOverlayLoadTileCompletionHandler result)
    {
        //I was using this prior to ios 13.2

        //NSUrl url = this.URLForTilePath(path);
        //NSData tileData = NSData.FromFile(url.AbsoluteString);
        //result(tileData, null);

        //Now I use this

        String folderPath = "tiles/" + path.Z + "/" + path.X + "/";
        String tilePath = NSBundle.MainBundle.PathForResource(path.Y.ToString(), "jpg", folderPath);
        String blankPath = NSBundle.MainBundle.PathForResource("tile", "jpg");

        try
        {
            //does the file exist?
            UIImage tile;
            if (File.Exists(tilePath))
            {
                tile = UIImage.FromFile(tilePath);
                if (tile == null)
                {
                    Console.WriteLine("Error Loading " + path.Z + " " + path.Y + " " + path.X);
                    //This may be redundant, as I'm not getting any errors here, even when the tile doesn't display
                }
            }
            else
            {
                tile = UIImage.FromFile(blankPath);
            }

            NSData tileData = tile.AsJPEG();
            result(tileData, null);
        }
        catch (Exception ex)
        {

        }
    }

這顯然是一個 MapKit 問題/錯誤。

自 2020 年 12 月 9 日起,我還打開了反饋票。

這個問題的根源不是很確定。

MapKit 和特別是 MKTileOverlay 總是有/有一些像 PNG 24 位這樣的“重”圖塊的問題。 當 MKTileOverlay 使用 PNG(重圖塊)時,圖塊有時會閃爍並且地圖會不斷重新加載,尤其是在寬屏幕(iPad pro 等)的情況下。

因此,由於 JPEG 圖塊通常比 PNG 輕,JPEG 可以作為一種解決方法。

但是,這個新的 iOS 13.2+ 問題不一樣! 不渲染隨機圖塊。 如果您移除並讀取 MKTileOverlay 或調用 MKTileOverlayRenderer 的 reloadData 方法,則會渲染丟失的圖塊,而丟失的將是其他隨機圖塊

真正解決問題的方法是開反饋票: https : //feedbackassistant.apple.com

編輯:我剛剛嘗試在非常簡單的 MKTileOverlay 項目示例中用 85% JPEG 替換我的 8 位 PNG,我已在我的票中發送給 Apple。 同樣的問題……沒有改善。

編輯 2 :將 NSData 加載到 UIImage 然后使用 UIImageRepresentationJPEG 似乎可以解決問題......丑陋......

- (void)loadTileAtPath:(MKTileOverlayPath)path result:(void (^)(NSData * _Nullable, NSError * _Nullable))result
{
    NSString *tilePath = [self PATHForTilePath:path];
    NSData *data = nil;

    if (![[NSFileManager defaultManager] fileExistsAtPath:tilePath])
    {
        NSLog(@"Z%ld/%ld/%ld does not exist!", path.z, path.x, path.y);
    }
    else
    {
        NSLog(@"Z%ld/%ld/%ld exist", path.z, path.x, path.y);

        UIImage *image = [UIImage imageWithContentsOfFile:tilePath];
        data = UIImageJPEGRepresentation(image, 0.8);
        // Instead of: data = [NSData dataWithContentsOfFile:tilePath];

        if (data == nil)
        {
            NSLog(@"Error!!! Unable to read an existing file!");
        }
    }

    dispatch_async(dispatch_get_main_queue(), ^{
        result(data, nil);
    });
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM