2013-05-23 6 views
2

Мне нужно повернуть UIView вокруг неподвижной точки.Вращение вида вокруг неподвижной точки - ObjectiveC

bubbleTail = [[BubbleTail alloc] initWithFrame:bubbleTailFrame]; 
[self addSubview:bubbleTail]; 
bubbleTail.layer.anchorPoint = triangle_top_left; 
CGAffineTransform transform = CGAffineTransformMakeRotation(M_PI * 180/180.0); 
bubbleTail.transform = transform; 

Это работает, только если я прокомментирую строку .anchorPoint. Как поворачивать представление о точке внутри представления?

+0

Что произойдет, если вы не прокомментируете это? Носовые демоны? –

+0

Читайте здесь http://ronnqvi.st/translate-rotate-translate/ – epatel

+0

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

ответ

0

Похоже, CGAffineTransformMakeRotation поворачивает его вокруг center?

Скажите, что у вас есть точка P (px,py), вы хотите, чтобы повернуть вокруг этого вида.
Let's A(ax,ay) = P - center = (px - centerx, py - centery).
И у вас есть угол alpha.

Затем вы можете сделать матрицу перевода с - A, а затем умножить ее на матрицу вращения с alpha, а затем умножить на матрицу перевода с помощью + A.

Функции, которые вам понадобятся: CGAffineTransformMakeTranslation, CGAffineTransformMakeRotation, CGAffineTransformConcat.

P.S. Не уверен, что это сработает (также не знаю, как выглядит представление rect, может быть, первое предположение о вращении вокруг центра неверно, тогда вы предполагаете A = P), но так оно и делается с аффинными преобразованиями.

+0

Моя проблема в том, что когда я поворачиваю представление, он должен вращаться, как рука часов, где центр - моя точка. Как мне это получить? –

+0

Вращение с аффинной матрицей из CGAffineTransformMakeRotation производится вокруг центра координат (0,0). Поэтому сначала вам нужно получить, где находится этот центр (просто поверните представление или google, он будет в центре представления или в верхнем левом углу), я не знаю, где. Затем выберите точку (похожую на середину правого края обзора), чтобы повернуть вид вокруг. Затем действуйте так, как я написал в ответ, center = (wi/2, he/2) [center of view] или (0,0) [левый верхний угол], P должен находиться в координатах вида с (0,0) в верхний левый угол.Не уверен, если это кажется понятным =) –

+0

Могу ли я зафиксировать положение точки? –

1

Нижеследующее должно помочь. Сложная часть является то, что установка anchorpoint после добавления вида с рамой затем перемещает вид. Я обошел это, инициировав UIView без рамки, а затем установив положение, границы и опорную точку своего слоя. Затем я использую ротацию, чтобы повернуть вокруг точки привязки.

CABasicAnimation *rotation; 
rotation = [CABasicAnimation animationWithKeyPath:@"transform.rotation"]; 
rotation.fromValue = [NSNumber numberWithFloat:0]; 
rotation.toValue = [NSNumber numberWithFloat:((360*M_PI)/180)]; 
rotation.duration = 60.0; 
rotation.repeatCount = HUGE_VALF; 

UIView *myview = [[UIView alloc] init]; 
[self.view addSubview:myview]; 
[myview setBackgroundColor:[UIColor orangeColor]]; 
[myview.layer setPosition:CGPointMake(10, 10)]; 
[myview.layer setBounds:CGRectMake(0, 0, 100, 100)]; 
[myview.layer setAnchorPoint:CGPointMake(0, 0)]; 
[myview.layer addAnimation:rotation forKey:@"myAnimation"]; 

Кто-то, пожалуйста, поправьте меня, если это не самый лучший метод, или если есть ошибки - я только знаю, что я в настоящее время знаю, - например, когда я должен использовать a. или f после поплавка.

Смежные вопросы