CGAffineTransformMakeRotation растягивает мое изображение, что я делаю не так? - PullRequest
8 голосов
/ 07 февраля 2011

У меня есть изображение, которое показывает, какой путь север на карте. Это изображение обновляется CoreLocation, если найден новый заголовок. Он также находится в правильном положении, я использую следующий код:

locateMeView.transform = CGAffineTransformMakeRotation(([CoreLocationController sharedInstance].heading - 45) * M_PI / 180);
CGRect frame = locateMeView.frame;
CGPoint pos = [MapClass vectorForLocation:[CoreLocationController sharedInstance].location mapCenter:curLocation zoom:curZoom];
frame.origin.x = (int)(self.view.bounds.size.width/2 + pos.x - frame.size.width / 2);
frame.origin.y = (int)(self.view.bounds.size.height/2 + pos.y - frame.size.height / 2);
frame.size.width = 24;
frame.size.height = 24;
locateMeView.frame = frame;

CoreLocationController - это класс, в котором хранятся обновления обычного CoreLocation. MapClass преобразует координаты широты / долготы в координаты х / у на моей карте. Положение изображения правильное, но поворот вызывает странные эффекты. Для 0 и M_PI изображение правильное, но между ними изображение растягивается, как если бы оно также вращалось вокруг оси z, а при M_PI / 2 и 3 * M_PI / 2 оно полностью исчезает. Может кто-нибудь объяснить, что происходит и что я делаю неправильно?

Ответы [ 3 ]

14 голосов
/ 07 февраля 2011

Я выяснил, что было не так (более или менее в любом случае). При использовании свойства transform вам не разрешено (по какой-либо причине) изменять положение путем изменения фрейма, вы должны использовать свойство center. Таким образом, код в конце был:

CGPoint pos = [MapClass vectorForLocation:[CoreLocationController sharedInstance].location mapCenter:curLocation zoom:curZoom];
locateMeView.transform = CGAffineTransformMakeRotation(([CoreLocationController sharedInstance].heading - 45) * M_PI / 180);
locateMeView.center = CGPointMake(int)(self.view.bounds.size.width/2 + pos.x), (int)(self.view.bounds.size.height/2 + pos.y));

Надеюсь, что кто-то с такой же проблемой найдет мой ответ.

6 голосов
/ 21 августа 2012

Другое решение:

  1. Установить преобразование в идентичность
  2. Изменить кадр
  3. Установить преобразование

В вашей ситуации это должнобыть:

locateMeView.transform = CGAffineTransformIdentity;

CGRect frame = locateMeView.frame;
CGPoint pos = [MapClass vectorForLocation:[CoreLocationController sharedInstance].location mapCenter:curLocation zoom:curZoom];
frame.origin.x = (int)(self.view.bounds.size.width/2 + pos.x - frame.size.width / 2);
frame.origin.y = (int)(self.view.bounds.size.height/2 + pos.y - frame.size.height / 2);
frame.size.width = 24;
frame.size.height = 24;
locateMeView.frame = frame;

locateMeView.transform = CGAffineTransformMakeRotation(([CoreLocationController sharedInstance].heading - 45) * M_PI / 180);
0 голосов
/ 07 февраля 2011

Попробуйте установить преобразование после изменения размера? Порядок может иметь значение с трансформациями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...