Масштабируем группу UIViews, но сохраняем свою позицию - PullRequest
0 голосов
/ 28 августа 2018

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

Предположим, у меня есть 3 вида, сложенных так

----------------------------------------------
|                                            |
|    -------                      --------   |   
|    |     |                      |      |   |
|    |  V1 |   ---------------    |      |   |
|    |     | X |     v2      |  Y |   v3 |   |
|    -------   ---------------    |      |   |
|                                 --------   |
---------------------------------------------

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

CGAffineTransform v1Transform =  CGAffineTransformScale( v1.transform,recognizer.scale, recognizer.scale);
v1.transform = v1Transform
CGAffineTransform v2Transform =  CGAffineTransformScale( v2.transform,recognizer.scale, recognizer.scale);
v2.transform = v2Transform
CGAffineTransform v3Transform =  CGAffineTransformScale( v3.transform,recognizer.scale, recognizer.scale);
v3.transform = v3Transform

И измените центр каждого вида, используя текущий масштаб, как это

   CGPoint v1Center = CGPointMake(v1.center.x * recognizer.scale,  node.imgView.center.y * recognizer.scale);
   CGPoint v2Center = CGPointMake(v2.center.x * recognizer.scale,  node.imgView.center.y * recognizer.scale);
   CGPoint v3Center = CGPointMake(v3.center.x * recognizer.scale,  node.imgView.center.y * recognizer.scale);
  v1.cente = v1Center;
  v2.center = v2Center;
  v3.center = v3Center;

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

enter image description here

Как видите, масштаб работает, как и ожидалось, и все 3 вида масштабируются вместе. Центр по-прежнему проблема. Я хочу, чтобы масштабирование делалось из всех 3-х видов реального места, я не хочу, чтобы они двигались таким образом в GIF.

Есть ли способ? любая помощь очень ценится

Ответы [ 3 ]

0 голосов
/ 28 августа 2018

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

Я делал это раньше, он в Swift и использует некоторые расширения библиотеки, которую я сделал, под названием CGMath *, но он должен быть достаточно хорош в качестве псевдокода:

let scale = recognizer.scale
//  Reset the scale of the recognizer. We'll scale the views by the change in the last tick.
recognizer.scale = 1
//  Get the center of all selected views as a CGPoint
let center = views.map { $0.center }.reduce(CGPoint.zero, +) / CGFloat(views.count)
views.forEach {
    //  Scale the view
    $0.scale *= scale
    //  Get the distance from this view to the center of all views, this is a CGPoint
    let distance = $0.center - center
    //  Multiply the distance by the scale and add it to the center of all views. Set that as the view's center.
    $0.center = center + (distance * scale)
}

* расширения в CGMath позволяют добавлять и вычитать точки.

0 голосов
/ 28 августа 2018

@ EmilioPelaez Ответ работает, как ожидалось. Это obj-c версия его псевдокода, если кто-то заинтересован

CGPoint newCenter =CGPointZero;
for(UIView *node in self.selectedNodes){
    newCenter = CGPointMake(newCenter.x + node.center.x, newCenter.y + node.center.y);
}

newCenter = CGPointMake(newCenter.x/self.selectedNodes.count, newCenter.y/self.selectedNodes.count);
for(UIview *node in self.selectedNodes){
    CGAffineTransform newTransform =  CGAffineTransformScale( node.transform,recognizer.scale, recognizer.scale);
    node.transform = newTransform;
    CGPoint distance = CGPointMake(node.center.x - newCenter.x, node.center.y - newCenter.y);
    CGPoint delta= CGPointMake(distance.x * recognizer.scale, distance.y * recognizer.scale);
    node.center =CGPointMake(newCenter.x + delta.x, newCenter.y + delta.y);
}
0 голосов
/ 28 августа 2018

То, что происходит, это то, что вы также масштабируете позиции x и y вида по отношению к 0,0, который является углом экрана. Вам нужно сделать это относительно центра экрана или, возможно, центра вашего жеста. Я не могу вспомнить, что у меня в голове, но я думаю, что есть способ указать опорную точку шкалы, если нет, вам придется рассчитывать корректировки положения вручную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...