Estoy haciendo una aplicación para iOS. En Xcode 9.1 creo un MKMapView por

let mapView = MKMapView(frame: CGRect(x: 0, y: 0, width: view.bounds.width, height: view.bounds.height))
mapView.isUserInteractionEnabled = false
mapView.mapType = .satellite
mapView.showsCompass = false
mapView.showsScale = true
view.addSubview(mapView)

Pero cuando lo ejecuto en el simulador, la escala no se muestra y recibo tres mensajes en el registro:

No se pudo insertar la brújula desde los bordes 9

No se pudo insertar la escala desde el borde 9

No se pudo insertar la atribución legal de la esquina 4

La brújula no se muestra (como se esperaba) pero tampoco se muestra si cambio mapView.showsCompass a true. Sin embargo, se muestra el enlace Legal. ¿Que me estoy perdiendo aqui? Supongo que es algo sobre las nuevas áreas seguras introducidas con iOS 11, pero no veo cuán importante es eso para una vista que quiero que cubra toda la pantalla.

4
Erik Magnusson 13 nov. 2017 a las 23:05

2 respuestas

La mejor respuesta

En iOS 10 o versiones anteriores

Como dice @ Paulw11, la escala solo se muestra al hacer zoom de forma predeterminada.

En iOS 11

Puede utilizar scaleVisibility. https://developer.apple.com/documentation/mapkit/mkscaleview/2890254-scalevisibility

let scale = MKScaleView(mapView: mapView)
scale.scaleVisibility = .visible // always visible
view.addSubview(scale)
7
Kosuke Ogawa 13 nov. 2017 a las 23:45

Tuve el mismo problema con la báscula hoy. Quiero que esa escala esté visible todo el tiempo. Me costó varias horas solucionarlo. Así que agrego el código aquí, por si acaso, alguien se encuentra con el mismo problema.

Tengo algunas pistas:

De este hilo: Use Safe Area Layout programáticamente

Y este sitio web: restricciones sin dolor con anclajes de diseño

Feliz codificación ...

Resistente

// "self.MapOnScreen" refers to the map currently displayed

// check if we have to deal with the scale
if #available(iOS 11.0, *) {

    // as we will change the UI, ensure it's on main thread
    DispatchQueue.main.async(execute: {

        // switch OFF the standard scale (otherwise both will be visible when zoom in/out)
        self.MapOnScreen.showsScale = false

        // build the view
        let scale = MKScaleView(mapView: self.MapOnScreen)

        // we want to use autolayout
        scale.translatesAutoresizingMaskIntoConstraints = false

        // scale should be visible all the time
        scale.scaleVisibility = .visible // always visible

        // add it to the map
        self.MapOnScreen.addSubview(scale)

        // get the current safe area of the map
        let guide = self.MapOnScreen.safeAreaLayoutGuide

        // Activate this array of constraints, which at the time removes leftovers if any
        NSLayoutConstraint.activate(
            [
                // LEFT (I do not want a change if right-to-left language) margin with an offset to safe area
                // alternative would be ".leadingAnchor", which switches to the right margin, if right-to-left language is used        
                scale.leftAnchor.constraint(equalTo: guide.leftAnchor, constant: 16.0),

                // right edge will be the middle of the map
                scale.rightAnchor.constraint(equalTo: guide.centerXAnchor),

                // top margin is the top safe area
                scale.topAnchor.constraint(equalTo: guide.topAnchor),

                // view will be 20 points high
                scale.heightAnchor.constraint(equalToConstant: 20.0)
            ]
        )
    })
}
3
Hardy_Germany 17 dic. 2017 a las 00:10