iOS版本之间的setRegion不一致吗?

Posted

技术标签:

【中文标题】iOS版本之间的setRegion不一致吗?【英文标题】:is setRegion inconsistent between iOS versions? 【发布时间】:2012-12-14 15:21:13 【问题描述】:

我前段时间开发了一款游戏。 游戏包含在西班牙地图上,您必须猜测该地图上的城市位置(我也有 EEUU 和中国版本) 我使用 ios 5 基础开发了所有这些,并使用 iOS 5 sdk。

然后,3 周前我更新了西班牙游戏,我不得不使用 iOS 6 sdk,在模拟器和我的 ipad 2 (iOS 5.0.1) 和 iPod touch (iOS 5.1) 上一切似乎都很好,并发布了更新。

但是当人们开始下载或更新新版本时,他们中的一些人因为地图不适合屏幕而联系了我。

这是我如何在我的设备和模拟器上查看游戏的屏幕截图。 (iPad 5.0.1 和 5.0、6.0 和 6.1 的模拟器,在视网膜和正常模式下)

这是它如何在其他人的设备上显示的屏幕截图。 (装有 iOS 6.0 的 iPad 3 和装有 iOS 6.0.1 的 iPad 2)

这是我的 iPad 代码(据我所知,在 iPhone 上按预期工作)

CLLocationCoordinate2D centerLocation;
MKCoordinateRegion region;
centerLocation.latitude = 39.016740;
centerLocation.longitude = -5.93504;
region = MKCoordinateRegionMakeWithDistance(centerLocation, 0, 800000);
[map setRegion:region];

起初我认为这是视网膜问题,因为第一个联系我的人使用的是 iPad 3,我在周一修复了 iPad 视网膜的地图,但昨天我从另一个使用 iPad 2 的用户那里得到了同样的信息.

那么,我做错了吗? 如果我的代码在模拟器上运行良好,我该如何测试它?

有人可以在真实设备上试用我的代码并告诉我他们得到的地图是第一个还是第二个?

EDIT1: 接受答案后的最终想法: 这不是iOS版本之间的问题,它似乎是时间问题,如果您在视图出现之前或之后设置它,区域会有所不同。 它发生在 iOS 5 和 iOS 6 中。

iOS 5 和 iOS 6 之间的唯一区别发生在真实设备上,如果您在地图出现之前设置区域,它会保持原样,但在模拟器上的 iOS 6 上它将保持原样,但在真实设备,显示为视图出现时设置的区域。

因此,解决方案是在viewDidAppear 上设置区域,它将在 iOS 5 和 iOS 6、模拟器和真实设备上以相同的方式显示。

编辑 2: 似乎该区域上的 0 也与问题有关,如果我使用 region = MKCoordinateRegionMakeWithDistance(centerLocation, 800000, 800000);,则该区域在视图加载前后是相同的,至少在模拟器上是一样的。 如果我使用region = MKCoordinateRegionMakeWithDistance(centerLocation, 0, 800000);,如果我在视图加载之前使用它,则区域会有所不同,并且在我以后使用它时会显示为“缩放”。

我会等到收到装有 iOS6 的 iPad Retina 后再继续测试这个问题。

【问题讨论】:

在我的例子中,我无法让 span 正常工作,直到我在 setRegion 上设置 'animated:NO'。如果我设置动画:YES,iOS 6 似乎忽略了跨度。 iOS 5 或更早版本没有此问题。 你解决了吗?无论我做什么,它都没有在 iphone4 ios6.1.3 中设置我想要的精确区域 在 viewDidAppear 上设置区域对我来说很有效。但是ios上的地区并不精确,我很幸运有适合3.5英寸屏幕和ipad的iphone上的西班牙地图的地区,但没有适合iphone 5上的西班牙地图的地区 【参考方案1】:

iOS 5 和 6 中区域的工作方式存在一些重要差异。在 iOS 5 上,您要求设置的区域很少是实际设置的区域。这与 iOS 5 上的 MapKit 始终设置允许平铺图像以 1:1 比例显示的区域有关。在 iOS 6 上,没有平铺图像,所有内容都是从矢量数据中绘制的,因此您获得的区域与您要求的区域非常接近。

话虽如此,我认为您的代码的问题可能在于时间。当我在viewDidLoad: 中设置地图区域时,我可以重现您的问题,即使我使用了适当的跨度(而不是使用0 作为纬度增量)。当我将代码移动到-viewDidAppear: 时,该区域在装有 iOS 6 的 iPad 以及装有 iOS 6 的模拟器上正确设置。这是我使用的代码:

- (void)viewDidAppear:(BOOL)animated

    [super viewDidAppear:animated];

    CLLocationCoordinate2D centerLocation = 
            CLLocationCoordinate2DMake(39.016740, -5.93504);
    MKCoordinateSpan span = MKCoordinateSpanMake(12.7, 12.7);
    MKCoordinateRegion region = MKCoordinateRegionMake(centerLocation, span);
    [self.mapView setRegion:region animated:NO];

我使用12.7 作为latitudeDeltalongitudeDelta。最好将该区域设置为正方形,以使该区域在横向和纵向模式下具有重要的位置。如果要使用 CLLocationCoordinate2DMake() 函数,则需要导入 Core Location 框架。

所以我认为问题在于 MapKit 在您尝试设置区域后设置它(在 iOS 6 上)。您可以使用以下代码检查-mapView:regionDidChangeAnimated:中设置的区域:

- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated

    NSLog(@"%f %f %f %f", 
            self.mapView.region.span.latitudeDelta, 
            self.mapView.region.span.longitudeDelta, 
            self.mapView.region.center.latitude, 
            self.mapView.region.center.longitude);

因此,如果您的代码在-viewDidLoad: 中设置区域,请尝试将其移至-viewDidAppear:

【讨论】:

我会检查我的代码,但我很确定我将其更改为 viewDidAppear 并且没有任何改变。你在使用自动布局吗?因为我在进行的测试中注意到了这一点,并且仅在选择自动布局时才会发生 检查是否是时间问题的一种方法是将您的区域设置为按下按钮。进行自定义操作并等待所有内容加载完毕,然后点击按钮。 你是对的,我在 viewWillAppear 上有代码,而不是在 viewDidAppear 上。 我仍然不明白为什么在模拟器上它可以按预期工作,但在真实设备上却不行,但至少现在,我可以知道地图将如何在真实设备上显示viewDidAppear 的代码,所以我接受你的回答并分配赏金 我自己也不是很懂,以前一直用-viewDidLoad:设置地图没有问题。我认为 iOS 6 中的一些时间安排发生了变化,注释的加载方式也有所不同。我有点像一个错误,你可能想在错误跟踪器中报告它。【参考方案2】:

你的坐标区域很奇怪——如果 MapKit 完全忽略它,我不会感到惊讶。

(39.016740, -5.93504) 的中心看起来不错,但您说理想情况下,您的视图将显示 0 米的纬度(即高度为零)和 800 公里的经度。

您是否尝试过提供合理的纬度值?

【讨论】:

可能还想看看-[MKMapView regionThatFits:],看看它给了你什么;可能会为您指明正确的方向。 如果我使用 region = MKCoordinateRegionMakeWithDistance(centerLocation, 800000, 800000); 我也会遇到同样的问题该区域被创建为适合屏幕的最大区域,因此 0 和 800000 之间没有区别 而我遇到的问题是,它在 iOS 5 设备上运行良好,在 iOS 5、iOS 6 和 iOS 6.1 模拟器上运行良好,但在 iOS 6 设备上运行良好跨度> 这似乎也与问题有关,如果我使用 region = MKCoordinateRegionMakeWithDistance(centerLocation, 800000, 800000);至少在模拟器上,视图加载前后的区域是相同的。我会等到收到装有 iOS6 的 iPad Retina 后再继续测试这个问题。如果我使用 region = MKCoordinateRegionMakeWithDistance(centerLocation, 0, 800000);如果我之前使用它,则该区域会有所不同,然后放大。【参考方案3】:

在 ios 5 上,您有使用谷歌地图的 mapkit,而在 ios 6 上,您有使用内置地图的 mapkit,可能存在差异——尤其是视觉方面

【讨论】:

Mapkit 在他们两个中。 iOS 5 上的 Mapkit 使用谷歌地图,iOS 6 上使用苹果地图,但两者都是 mapkit。奇怪的是,地图区域(或缩放级别)在模拟器上正确显示,但在 iOS 6 设备上却没有 pedantic :D 但你是对的......不过我的意思是对的,无论如何编辑了我的答案 大声笑,很抱歉,但它可能与新的 google maps sdk 混淆,我只是想明确说明我在两个版本上使用 mapkit 和相同的代码,旧版本和更新。它仍然对我没有多大帮助,我不明白为什么苹果地图显示的区域或缩放级别与真实设备不同

以上是关于iOS版本之间的setRegion不一致吗?的主要内容,如果未能解决你的问题,请参考以下文章

iOS 14 中设备之间的小部件行为不一致

linux分布式施压 jmeter版本不一致可以吗?

docker导入导出版本需一致吗

*某些* iOS 8 版本中的自定义导航项的内部不一致异常

java版本和javac版本不一致

协议违规错误和OALL8处于不一致状态