Масштабирование MKMapView и регион

Существует шаблон, который я узнал из Скрученного кода Python.

class SMTP:
    def lookupMethod(self, command):
        return getattr(self, 'do_' + command.upper(), None)
    def do_HELO(self, rest):
        return 'Howdy ' + rest
    def do_QUIT(self, rest):
        return 'Bye'

SMTP().lookupMethod('HELO')('foo.bar.com') # => 'Howdy foo.bar.com'
SMTP().lookupMethod('QUIT')('') # => 'Bye'

можно использовать его любое время, которое необходимо диспетчеризировать на маркере и выполнить расширенную часть кода. В конечном автомате Вы имели бы state_ методы и отправка на self.state. Этот переключатель может быть чисто расширен путем наследования базовому классу и определения собственного do_ методы. Часто времена Вы не будете даже иметь do_ методы в базовом классе.

Редактирование: как точно то, который использовал

В случае SMTP, Вы получите HELO от провода. Соответствующие нормы (от twisted/mail/smtp.py, измененный для нашего случая) похожи на это

class SMTP:
    # ...

    def do_UNKNOWN(self, rest):
        raise NotImplementedError, 'received unknown command'

    def state_COMMAND(self, line):
        line = line.strip()
        parts = line.split(None, 1)
        if parts:
            method = self.lookupMethod(parts[0]) or self.do_UNKNOWN
            if len(parts) == 2:
                return method(parts[1])
            else:
                return method('')
        else:
            raise SyntaxError, 'bad syntax'

SMTP().state_COMMAND('   HELO   foo.bar.com  ') # => Howdy foo.bar.com

, Вы получите ' HELO foo.bar.com ' (или Вы могли бы добраться 'QUIT' или 'RCPT TO: foo'). Это маркируется в [1 111] как [1 112]. Фактическое имя поиска метода взято от [1 113].

(Исходный метод также называют state_COMMAND, потому что он использует тот же шаблон для реализации конечного автомата, т.е. getattr(self, 'state_' + self.mode))

85
задан bvd 24 January 2012 в 14:39
поделиться

4 ответа

Прежде всего, MKMapView не работает использовать / иметь предопределенный набор уровней масштабирования, как в Google Maps.

Вместо этого видимая область MKMapView описывается с помощью MKCoordinateRegion , который состоит из двух значений:

  1. center ( центральная точка области) и
  2. span (размер видимой области вокруг центра).

Центральная точка должна быть очевидной (это центральная точка области).

Однако , span (который представляет собой MKCoordinateSpan ) состоит из:

  1. latitudeDelta (вертикальное расстояние, представленное областью) и
  2. longitudeDelta (горизонтальное расстояние, представленное областью

Краткий пример. Вот'

  • широта: 0
  • долгота: 0
  • промежуток:
    • latitudeDelta: 8
    • longitudeDelta: 6
  • Регион может быть описан с использованием его минимальных и максимальных координат следующим образом:

    1. min координата (нижняя левая точка):
      • широта: -4
      • долгота: -3
    2. максимальная координата (верхняя правая точка):
      • широта: 4
      • долгота: 3

    Таким образом, вы можете указать уровни масштабирования вокруг центральной точки, используя MKCoordinateSpan соответствующего размера. В качестве приближения к числовым уровням масштабирования Google вы можете реконструировать размеры диапазона, которые Google использует для заданного уровня масштабирования, и соответственно создать диапазон. (Google описывает их области просмотра так же, как MKMapView, как центр + диапазон, поэтому вы можете извлечь эти значения из Google Maps.)

    Что касается ограничения области, вы можете играть с этим методом делегата:

    mapView:regionWillChangeAnimated
    

    например, изменив размер области до допустимого уровня масштабирования. (Это похоже на то, как виды таблицы позволят вам прокрутить за край, но затем резиновая лента вернется на место.) Однако ваш опыт может отличаться, поскольку я не использовал его для этой цели.

    Кстати, есть определенные исправления / улучшения в OS 3.

    134
    ответ дан 24 November 2019 в 08:09
    поделиться

    Диапазон указывается в градусах широты и долготы. Вместо этого существует метод построения структур MKCoordinateRegion, использующий расстояние. Возможно, вы используете MKCoordinateRegionMakeWithDistance для указания диапазона, а затем, когда вы проверяете его в regionDidChange, вы видите диапазон широты / долготы, который хранится в структуре MKCoordinateRegion.

    Что касается Я знаю, что целочисленные уровни масштабирования недоступны или вообще не используются при работе с MKMapKit. Я лично предпочитаю использовать цифры диапазона, они более гибкие.

    Вы не можете указать максимальное и минимальное масштабирование, и я не знаю, как его взломать. MKMapKit на самом деле сейчас довольно слаб, я очень разочарован отсутствием функций.

    4
    ответ дан 24 November 2019 в 08:09
    поделиться

    A quick comparison of zoom levels for a location using maps.google.com by inspecting the link querystring shows that the dx and dy span values increase by a factor of 2:

     (0.005334, 0.011834) starting span
     (0.010668, 0.023668) dx: x2, dy: x2 
     (0.021335, 0.047337) dx: x2, dy: x2
     (0.042671, 0.094671) dx: x2, dy: x2
      ...
    
    3
    ответ дан 24 November 2019 в 08:09
    поделиться

    Если вы предпочитаете использовать явные уровни масштабирования вместо определения MkcoordinatePan, я написал категорию, которая добавляет поддержку для указания уровня масштабирования MkmapView. Код можно найти здесь .

    118
    ответ дан 24 November 2019 в 08:09
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: