Существует шаблон, который я узнал из Скрученного кода 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)
)
Прежде всего, MKMapView не работает использовать / иметь предопределенный набор уровней масштабирования, как в Google Maps.
Вместо этого видимая область MKMapView описывается с помощью MKCoordinateRegion , который состоит из двух значений:
Центральная точка должна быть очевидной (это центральная точка области).
Однако , span (который представляет собой MKCoordinateSpan ) состоит из:
Краткий пример. Вот'
Регион может быть описан с использованием его минимальных и максимальных координат следующим образом:
Таким образом, вы можете указать уровни масштабирования вокруг центральной точки, используя MKCoordinateSpan соответствующего размера. В качестве приближения к числовым уровням масштабирования Google вы можете реконструировать размеры диапазона, которые Google использует для заданного уровня масштабирования, и соответственно создать диапазон. (Google описывает их области просмотра так же, как MKMapView, как центр + диапазон, поэтому вы можете извлечь эти значения из Google Maps.)
Что касается ограничения области, вы можете играть с этим методом делегата:
mapView:regionWillChangeAnimated
например, изменив размер области до допустимого уровня масштабирования. (Это похоже на то, как виды таблицы позволят вам прокрутить за край, но затем резиновая лента вернется на место.) Однако ваш опыт может отличаться, поскольку я не использовал его для этой цели.
Кстати, есть определенные исправления / улучшения в OS 3.
Диапазон указывается в градусах широты и долготы. Вместо этого существует метод построения структур MKCoordinateRegion, использующий расстояние. Возможно, вы используете MKCoordinateRegionMakeWithDistance для указания диапазона, а затем, когда вы проверяете его в regionDidChange, вы видите диапазон широты / долготы, который хранится в структуре MKCoordinateRegion.
Что касается Я знаю, что целочисленные уровни масштабирования недоступны или вообще не используются при работе с MKMapKit. Я лично предпочитаю использовать цифры диапазона, они более гибкие.
Вы не можете указать максимальное и минимальное масштабирование, и я не знаю, как его взломать. MKMapKit на самом деле сейчас довольно слаб, я очень разочарован отсутствием функций.
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
...
Если вы предпочитаете использовать явные уровни масштабирования вместо определения MkcoordinatePan, я написал категорию, которая добавляет поддержку для указания уровня масштабирования MkmapView. Код можно найти здесь .