Странное поведение кадра UIView после поворота в iPhone

Создайте квадратный объект UIView testView_ и добавьте его в viewDidLoad:

- (void)viewDidLoad {
[super viewDidLoad];
CGRect initialRect = testView_.frame;
NSLog(@"before rotation: w %f h %f x %f y %f", initialRect.size.width, initialRect.size.height, initialRect.origin.x, initialRect.origin.y);
testView_.transform = CGAffineTransformMakeRotation(0.1);
NSLog(@"after rotation: w %f, h %f, x %f, y %f", testView_.frame.size.width, testView_.frame.size.height, testView_.frame.origin.x, testView_.frame.origin.y);
testView_.frame = initialRect;
NSLog(@"reassign: w %f, h %f, x %f, y %f", testView_.frame.size.width, testView_.frame.size.height, testView_.frame.origin.x, testView_.frame.origin.y);
}

Я получаю это в консоли:

2011-04-27 12:30:32.492 Test[31890:207] before rotation: w 100.000000 h 100.000000 x 20.000000 y 20.000000
2011-04-27 12:30:32.494 Test[31890:207] after rotation: w 109.483757, h 109.483757, x 15.258121, y 15.258121
2011-04-27 12:30:32.495 Test[31890:207] reassign: w 117.873589, h 100.000000, x 11.063205, y 20.000000

Я не мог понять логику этого изменения значения кадра, особенно последнего. Кто-нибудь может просветить меня? Спасибо.


person Enzo Tran    schedule 27.04.2011    source источник
comment
Я не совсем уверен в этом ответе. Поэтому я помещаю это как комментарий. Когда мы поворачиваем представление, скажем, B, которое является подвидом A, изменяется только преобразование B. Кадр рассматривается с точки зрения его позиции в parentView, т. е. положения B в A. Таким образом, когда мы поворачиваем B, общее квадратное пространство (вычисленное в преобразовании A), которое B занимает в A, увеличивается. Это причина для второго журнала. Теперь, в-третьих, вы принудительно передаете исходный кадр B, но повернутый B теперь имеет размер, чем исходный размер, что заставляет parentView A автоматически настраивать B, сохраняя только одно направление (y и высота/x и ширина) постоянным .   -  person Krishnabhadra    schedule 27.04.2011
comment
хороший вопрос, хотя.. я тоже хотел бы знать..   -  person Krishnabhadra    schedule 27.04.2011
comment
у тебя нет ответа... очень плохо..   -  person Krishnabhadra    schedule 28.04.2011


Ответы (1)


В справочнике по классам UIView вы можете увидеть здесь, что вы не должны устанавливать рамку представления со свойством преобразования, отличным от CGAffineTransformIdentity.

Если вы хотите изменить положение преобразованного представления, вы должны использовать свойство center. Если вы хотите настроить размер, вы должны использовать свойство bounds.

person losic    schedule 03.05.2011
comment
Если это кому-то поможет, я решил это, сначала установив view.transform = CGAffineTransformIdentity, затем установив рамку, а затем установив вращение с помощью view.transform = CGAffineTransformMakeRotation(angle); - person Liron; 30.04.2013
comment
@Liron Кажется, это больше не работает. У рамы есть проблемы. - person Chris Van Buskirk; 13.12.2016
comment
Что ты пытаешься сделать? Этот пост довольно старый, поэтому я не уверен, что действительно помню, о чем это было. В большинстве случаев в наши дни мне проще использовать автоматическую компоновку, чем назначать кадр вручную, но, конечно, это зависит от приложения. - person Liron; 14.12.2016
comment
@Liron Am работает над старым кодом, где автомакет не имеет смысла. Во всяком случае, в коде порядок правильный и раньше работал, а теперь нет. Рамка случайным образом любит меняться. - person Chris Van Buskirk; 14.12.2016