在iOS 11的xcode 9中 - 在第一次运行时加载地图图块的问题

时间:2017-09-05 08:08:45

标签: ios mapkit ios11

- 更新了新发现 - 在模拟器和设备上进行了测试。从冷启动运行应用程序时,无法正确加载地图。瓷砖没有显示。

mapViewDidFinishLoadingMap未被调用。因此地图不能完成会出错,但我没有错误。

如果我只是简单地退出应用程序然后再次进入,那么地图就可以正常加载。这意味着如果从后台打开应用程序,则会加载地图。

任何想法有什么变化?在iOS 10中工作得很好。

enter image description here

更新

在iOS 11中mapViewWillStartLocatingUser被调用但不是mapViewWillStartRenderingMap。我想知道是否必须手动调用某些内容才能启动地图渲染。在iOS 9中(我测试的是什么,它运作得很好)mapViewWillStartRenderingMap之前调用了mapViewWillStartLocatingUser

4 个答案:

答案 0 :(得分:0)

我认为你应该尝试删除

- (void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];

}

并将以下代码放入View Didload方法

    CGFloat edge = 10.0f;

    UIImage *gotoUserLocationButtonImage = self.gotoUserLocationButton.imageView.image;
    self.gotoUserLocationButton.frame = CGRectMake(edge, edge + self.statusBarHeight, gotoUserLocationButtonImage.size.width, gotoUserLocationButtonImage.size.height);

    UIImage *getDirectionsButtonImage = self.getDirectionsButton.imageView.image;
    [self.getDirectionsButton setFrame:CGRectMake(CGRectGetMaxX(self.gotoUserLocationButton.frame), edge + self.statusBarHeight, getDirectionsButtonImage.size.width, getDirectionsButtonImage.size.height)];

答案 1 :(得分:0)

确保您没有使用dispatch_async作为地图。

我有以下在iOS11中无效的功能

dispatch_async(dispatch_get_main_queue(), ^{
    @synchronized(_queue) {
        if(poppedMapView != nil) {
            [self.queue removeObject:poppedMapView];
        }
        [self.queue addObject:[[MKMapView alloc] init]];
    }
});

将其更改为

if(poppedMapView != nil) {
    [self.queue removeObject:poppedMapView];
}
[self.queue addObject:[[MKMapView alloc] init]];

答案 2 :(得分:0)

我有完全相同的问题,花了很多时间找到解决方案,最后我做到了。所以在我的情况下问题是错误的inisializing。通常你会在viewController的顶部编写mapView = MKMapView(),然后在viewDidLoad中的某个地方自定义它,但在IOS 11 Beta 1之后它停止工作。我通过更改为var mapView:MKMapView来修复它?在viewController的顶部,然后在viewDidLoad里面我inisializ就像mapView = MKMapView()。希望它可以帮到某人! :)

答案 3 :(得分:0)

同样的问题我的BROKEN代码看起来像:

class ViewController: UIViewController {

    fileprivate var mapView = MKMapView()

    override func viewDidLoad() {
        super.viewDidLoad()

        // Add the mapView to the VC
        mapView.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(mapView)
        mapView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
        mapView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
        mapView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
        mapView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
    }
}

正如在iOS 11中发现的那样,它不喜欢在视图控制器加载之前初始化MKMapView,即viewDidLoad()所以FIX正在改为:

class ViewController: UIViewController {

    fileprivate var mapView: CSMapView?

    override func viewDidLoad() {
        super.viewDidLoad()

        // Init instance here.
        mapView = CSMapView()

        // Add the mapView to the VC
        mapView?.translatesAutoresizingMaskIntoConstraints = false
        ...
    }
}

还尝试将它放在init方法中,但这对我不起作用:

override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
    super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
    mapView = MKMapView()
}

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    mapView = MKMapView()
}