2015-07-17 2 views
1

Я хочу анимировать представление, центрируя одну из ее точек до центра экрана, а затем масштабируйте ее.Перевести и масштабировать UIView в Objective-C

Так что, если у меня есть этот экран (S) с целью (V) в нем, и в определенный момент (x):

+-------------+ 
|S-----------+| 
||V   || 
||   || 
||   || 
||   || 
||   || 
|| x  || 
||   || 
|+-----------+| 
+-------------+ 

Я хочу это анимировать эту позицию:

+-----------+ 
+---V---------+| 
|S |   || 
| |   || 
| |   || 
| |   || 
| | x  || 
| |   || 
| +----------|+ 
|    | 
|    | 
+-------------+ 

где точка находится в центре экрана, а затем масштабировать его так:

+-------------------+ 
|V     | 
|     | 
|     | 
|     | 
|+-------------+ | 
||S   | | 
||    | | 
||    | | 
||    | | 
||  x  | | 
||    | | 
||    | | 
||    | | 
||    | | 
|+-------------+ | 
+-------------------+ 

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

Я попытался это:

CGAffineTransform translateTransform = CGAffineTransformMakeTranslation(deltaPoint.x, deltaPoint.y); 
CGAffineTransform scaleTransform = CGEqualAffineTransformMakeScale(40); 

self.screenView.transform = CGAffineTransformConcat(translateTransform, scaleTransform); 

, где deltaPoint является CGPoint, имеющим это x и y равно расстоянию между абсолютными координатами точки в (по отношению к экрану) и координатой центра экрана , но он слегка приближает точку вправо.

Я также попытался вычисления deltaPoint после масштабирования без толку:

self.screenView.transform = CGEqualAffineTransformMakeScale(40); 

// calculate deltaPoint 

self.screenView.transform = CGAffineTransformTranslate(self.screenView.transform, deltaPoint.x, deltaPoint.y); 

В обоих случаях, если я закомментировать масштабное преобразование, перевод работы, он двигался он совершенно центр, поэтому проблема ISN» т в расчете deltaPoint.

+0

@Eiko, я обновил вопрос. –

+0

Вы пробовали конкат с отменой заказа? – Eiko

+0

@ Эйко, да, но это все еще не работает. –

ответ

2

Вы хотите масштабировать представление с масштабным коэффициентом (Sx, Sy) и переместить точку (x0, y0) в (x1, y1). И вы рассчитали dx,dy. Так давайте делать некоторые вычисления:

Sx.x0 + a = x0 + dx => a = dx - (Sx-1).x0 
Sy.y0 + b = y0 + dy => b = dy - (Sy-1).y0 

С Sx = Sy = 40 поэтому мы имеем a = dx - 39.x0 и b = dx - 39.y0. Таким образом, мы преобразование вектора, как этот

CGAffineTransform scaleTransform = CGAffineTransformMake(40, 0, 0, 40, a, b); 
self.screenView.transform = CGAffineTransformConcat(translateTransform, scaleTransform); 

x0, y0 ваша оригинальная точка зрения x в v, перед любой трансформацией. Вы можете позвонить ему pointX.x, pointX.y. В вашем примере используется коэффициент масштабирования 40, поэтому я его повторно использую. Так, чтобы Sx-1 и Sy - 1 вернули то же значение, 39.

+0

Проблема заключается в том, что после установки 'anchorPoint' мой взгляд перемещается в неправильном положении, поэтому точка' x' больше не находится в центре. –

+0

У меня есть обновленный мой новый ответ. Пожалуйста, проверьте это – sahara108

+0

Я думаю, что это ошибка: 'CGAffineTransform t = CGAffineTransform scaleTransform = CGAffineTransformMake (40, 0, 0, 40, a, b);'. Кроме того, что такое 'a' и' b'? –

0

Я понял, что после того, как представление v и точка x переходят в нужное положение, вы хотели, чтобы вид был увеличен с точки x, поэтому даже после того, как точка масштабирования x останется в центре экрана, TRUE, то после перевода вам необходимо настроить точку привязки таким образом, чтобы точка привязки была равна x.

+0

То, что 'anchorPoint' представления равно' x' относительно 'screen'? –

0

Я полагаю screenView ваше мнение (V)

так что вы можете попробовать что-то вроде этого:

[UIView animateWithDuration:2 // put translation duration here 
       animations:^{ 
        self.screenView.center = CGPointMake(self.screenView.center.x + deltaPoint.x, self.screenView.center.y + deltaPoint.y); 
       } 
       completion:^(BOOL finished) { 
        [UIView animateWithDuration:2 // put scale duration here 
             animations:^{ 
              self.screenView.transform = CGAffineTransformMakeScale(1.1, 1.1); // here the final size will be 110% 
             } 
             completion:nil]; 
       } 
]; 

Если вы хотите сделать это в то же время так просто поставить весы в то же блок:

[UIView animateWithDuration:2 // put translation duration here 
       animations:^{ 
        self.screenView.center = CGPointMake(self.screenView.center.x + deltaPoint.x, self.screenView.center.y + deltaPoint.y); 
        self.screenView.transform = CGAffineTransformMakeScale(1.1, 1.1); // here the final size will be 110% 
       } 
       completion:nil 
]; 
+0

Для вашего первого вопроса, да. И я хочу перевести и масштабировать одновременно. –

+0

Я, конечно, __do__ имею их в одном блоке. –

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