Инвертирование шкалы преобразования - PullRequest
0 голосов
/ 09 февраля 2012

У меня проблема с попыткой инвертировать, так сказать, шкалу преобразования. Вот мой код:

    - (void)updateTransforms {

    CGAffineTransform holeTransform = CGAffineTransformIdentity;
    holeTransform = CGAffineTransformTranslate(holeTransform, _holeOffset.x, _holeOffset.y);
    holeTransform = CGAffineTransformRotate(holeTransform, _holeRotation);
    //Problem code:
    holeTransform = CGAffineTransformScale(holeTransform, _holeScale, _holeScale);

    self.transform = holeTransform;
    self.imageToUse.transform = CGAffineTransformInvert(holeTransform); }

Это в основном метод, который позволяет мне вращать, панорамировать и масштабировать мой объект. Желаемый эффект, который я хочу, противоположен каждому действию. Поэтому, если вы двигаетесь влево, изображение перемещается вправо, поворачивается влево, оно вращается вправо, масштабируется вверх, изображение масштабируется с той же скоростью. Этот код отлично работает для панорамирования и поворота.

Я полагаю, что проблема заключается в инверсии шкалы, потому что на самом деле шкала не становится отрицательной, она просто увеличивается или уменьшается с 1,0. Как я могу изменить свой код для правильного масштабирования? Спасибо.

Ответы [ 2 ]

2 голосов
/ 10 февраля 2012

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

Как отметил в своем ответе Пиччиано, чтобы инвертировать масштабный коэффициент, вы берете его взаимное значение, а не отрицательное. Вы, очевидно, думаете, что вам нужен отрицательный коэффициент масштабирования. Исходя из этого, я предполагаю, что вы инициализируете его в 0 (что является его собственным отрицательным значением) вместо 1 (что является его собственным обратным значением) и получаете такие ошибки:

Feb  9 14:17:41 Robs-iPad-2 imagehole[3138] <Error>: CGAffineTransformInvert: singular matrix.

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

  1. Вам нужно инициализировать _holeScale до 1 . Вы можете сделать это в viewDidLoad или viewWillAppear. Если у вас есть кнопка сброса или аналогичный элемент управления, вам нужно сделать это и там.

  2. Вам необходимо умножить _holeScale на шкалу распознавателя жестов и сбросить шкалу распознавателя на 1 , а не 0 :

    - (IBAction)pinchGesture:(UIPinchGestureRecognizer *)sender {
        _holeScale *= sender.scale;
        sender.scale = 1;
        [self updateTransforms];
    }
    

Вы можете загрузить мой тестовый проект , чтобы увидеть рабочий пример.

2 голосов
/ 09 февраля 2012

Это должно сделать это: 2.0f становится 0.5f, 5.0f становится 0.2f и т. Д. Вам, вероятно, нужно создать новый объект преобразования, а не пытаться сделать преобразование инвертированным.

holeTransform = CGAffineTransformScale(holeTransform, 1.0f/_holeScale, 1.0f/_holeScale);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...