CAAffineTransformationMakeRotation проблема - PullRequest
1 голос
/ 30 ноября 2010

У меня проблема с CAAffineTransformationMakeRotation.Я пытаюсь повернуть UIView с 22,5 градусами в ViewDidLoad, и после задержки в 1 секунду View вылетает на экран.

код:

-(void)ViewDidiLoad{

imgView1 = [[UIView alloc] initWithFrame:CGRectMake(20,150,.1,400)];
    [imgView1 setBackgroundColor:[UIColor blackColor]];
[self.view addSubview:imgView1];
CGAffineTransform trans = CGAffineTransformMakeRotation(3.14159/8);
imgView1.transform = trans;

[self performSelector:@selector(img1_enter) withObject:nil afterDelay:1];
 } 


 -(void)img1_enter{
CGRect frame = [imgView1 frame];

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:2.99];
frame.origin.x = 550;
[UIView commitAnimations];


[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:2.99];
[imgView1 setFrame :frame];
[UIView commitAnimations];
}   

Проблема в том, чтокогда этот вид мухи ... ее ширина и высота меняется.Я пытался без вращения вида (то есть без AffineTransformation), он работает правильно.

Есть ли какой-либо другой метод, чтобы вращать вид ??

Ответы [ 2 ]

1 голос
/ 30 ноября 2010

Вы можете включить уже существующее преобразование, чтобы сохранить текущий размер или соотношение сторон:

imgView1.transform = CGAffineTransformConcat(trans, imgView1.transform);

Также в документации класса UIView говорится, что свойство frame не определено, если преобразование не является преобразованием идентичности, поэтому вы не должны использовать его после применения поворота.

0 голосов
/ 01 декабря 2010

Рамка-прямоугольник представляет позицию и размер представления в системе координат его суперпредставления. Прямоугольник границ представляет внутреннюю систему координат представления, поэтому прямоугольник границ является своего рода ответственным за фактическое количество пикселей (соответственно количество столбцов и строк) представления.

Если для contentMode установлено значение UIViewContentModeRedraw и вы изменяете прямоугольник рамки, то размер прямоугольника границ автоматически настраивается так, чтобы он соответствовал размеру прямоугольника рамки, и наоборот, в противном случае границы - прямоугольник остается нетронутым. Для визуализации разница между прямоугольником рамки и прямоугольником границ компенсируется автоматически созданной матрицей преобразования.

Последние два предложения верны, только если свойство transform представления является единичной матрицей. Если это не так, свойство frame является недействительным, и вы несете ответственность за правильное преобразование из системы координат представления в систему координат его суперпредставления. Поэтому, если вы хотите применить вращение, вы также должны применить правильный перевод и масштабирование, чтобы получить вид, в котором вы хотите, чтобы он был относительно координат его суперпредставления.

Так что в вашем случае вы можете установить прямоугольник границ на CGRectMake(-width/2, -height/2, width, height) и установить его преобразование на

CGAffineTransformConcat(
    CGAffineTransformMakeRotation(angle),
    CGAffineTransformMakeTranslation(x, y)
)

, где x и y - координаты центра вида в системе координат его суперпредставления.

...