Вы используете self.center
вместо self.frame.origin.x
и self.frame.origin.y
, затем вы настраиваете перевод и добавляете его в lastLocation.
По сути, ваш вид вычисляет позицию, измененную из центра вида, как если бы вы отлично перетаскивали из этого местоположения, а затем переводили + lastLocation. Я уверен, просто прочитав, что вы знаете о проблеме.
Исправление простое.
self.frame.origin.x = translation.x
self.frame.origin.y = translation.y
Разница - это начальный расчет с переводом. Происхождение захватит позицию x / y в зависимости от того, где начинается событие касания. В то время как .center
всегда идет от центра.