CGAffineTransformMakeRotation растягивает изображение, что я делаю не так?

У меня есть изображение, которое показывает, какой путь на север на карте. Это изображение обновляется 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 преобразует координаты широты/долготы в координаты x/y на моей карте. Положение изображения правильное, но вращение вызывает странные эффекты. При 0 en M_PI изображение правильное, но между ними изображение растягивается, как будто его еще и вращают вокруг оси z, а при M_PI/2 и 3 * M_PI/2 оно вообще исчезает. Может кто-нибудь объяснить, что происходит и что я делаю неправильно?


person Vincent Osinga    schedule 06.02.2011    source источник


Ответы (3)


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

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));

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

person Vincent Osinga    schedule 07.02.2011
comment
Это сводило меня с ума. Спасибо, что поделился. - person jamone; 10.12.2011
comment
Как описано здесь, вы также можете использовать свойство bounds. - person ; 27.06.2012
comment
К сожалению, это искажение все еще происходит, даже если вы не меняете кадр или положение. - person Oscar; 06.07.2012
comment
@Oscar: установка ContentMode на UIViewContentMode.Center может решить вашу проблему. - person Darbio; 17.10.2012
comment
+1, этот ответ дал мне достаточно подсказок, и я вспомнил, что нужно просто отключить Auto-Layout в представлении верхнего уровня. Спасибо! - person Olie; 05.11.2013

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

  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);
person HiveHicks    schedule 21.08.2012
comment
Отличный совет установить преобразование на личность в начале. Это особенно полезно, если вы устанавливаете преобразование в -layoutSubviews, а ваш layoutSubviews вызывается дважды. - person codeperson; 29.01.2013
comment
просто добавление этой строки исправило мою проблему locateMeView.transform = CGAffineTransformIdentity; Спасибо - person Sam B; 26.07.2015

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

person Hack Saw    schedule 07.02.2011
comment
Я пробовал все разные заказы, но, как вы можете видеть, спустя несколько часов, я нашел решение. - person Vincent Osinga; 07.02.2011
comment
Молодец! Спасибо, что поделились. - person Hack Saw; 08.02.2011